本文目錄一覽:
求助 java一個二維數組代表迷宮。0代表道路 2表示牆壁。 假設老鼠會從數組[1][0]開始
這個可以用 堆棧 來完成。
用堆棧的基本思路就是。
設置一個起點A。將 A 入棧 。
從A開始找到第一個可以達到的點B。將 B 入棧 。
如果B無路可走。則在A點處重新換一個可達到的點。否則繼續 2-3 。直到達到終點。或者五路可走。
詳細的解釋,這兒有一篇博文:
java老鼠迷宮代碼難嗎
非常難。思路:
1、設老鼠的行進路線都是優先選擇下-右-上-左。
2、設老鼠很聰明,走過的路線走撒泡尿,表示鼠大爺到此一游,我們可以把數組的值改為3,表示走過,但走不通。
3、這是一個int[8][8]的二位數組,那麼開始位置下標是1,1,結束位置是6,6。行和列分別用、j表示。
4、實際路線我們可以設置2表示,我們可以使用遞歸,讓老鼠不斷測試路線。
5、最後列印數組,看老鼠的實際路線。
java編程 老鼠走迷宮
簡單點說叫做尋路,涉及到深度優先搜索和廣度優先搜索,當然在存在類似「戰爭迷霧」效果的同時還要涉及到動態規劃和回溯。
程序設計 老鼠走迷宮
#include stdio.h
#include stdlib.h
#include time.h
/*迷宮的數組*/
int maze[100][100];
/*迷宮的行數和列數*/
int m=7,n=7;
/*
*對迷宮進行初始化,用隨機數產生迷宮
*/
void InitMaze()
{
int i,j,temp;
srand((unsigned)time(NULL));
for(i=1;i=m;i++)
for(j=1;j=n;j++)
{
temp=rand()%100;
if(temp30)
{
maze[i-1][j-1]=0;
}else
{
maze[i-1][j-1]=1;
}
}
maze[0][0]=0;
maze[m-1][n-1]=9;
}
/*
*定義棧和棧的節點
*/
typedef struct Node
{
int x;
int y;
struct Node *next;
}Node,*Stack;
/*
*初始化Stack
*/
void InitStack(Node *Stack)
{
Stack=(Node *)malloc(sizeof(Node));
if(Stack==NULL)
{
printf(“分配空間失敗\n”);
exit(0);
}else
{
Stack-next=NULL;
}
}
/*
*壓棧
*/
void push(Node *Stack,int x,int y)
{
Node *temp;
temp=(Node *)malloc(sizeof(Node));
if (!temp)
{
printf(“分配內存空間錯誤”);
return;
}
else
{
temp-x=x;
temp-y=y;
temp-next=Stack-next;
Stack-next=temp;
}
}
/*
*出棧
*/
void pop(Node *Stack,int *x,int *y)
{
Node *temp;
temp=Stack-next;
if(!temp){
return;
}else{
*x=temp-x;
*y=temp-y;
}
Stack-next=temp-next;
free(temp);
}
/*
*判斷棧是否為空
*/
int isEmpty(Node *Stasck)
{
return ((Stasck-next)==NULL);
}
/*
*判斷從該點時候可以向其他方向移動,並返回移動的方向
*/
int pass(int i,int j)
{
/*右方向*/
if(jn-1(maze[i][j+1]==0||maze[i][j+1]==9))
{
return 2;
}
/*下方向*/
if(im-1(maze[i+1][j]==0||maze[i+1][j]==9))
{
return 3;
}
/*左方向*/
if(j=1(maze[i][j-1]==0||maze[i][j-1]==9))
{
return 4;
}
/*上方向*/
if(i=1(maze[i-1][j]==0||maze[i-1][j]==9))
{
return 5;
}
return -1;
}
/*
*對迷宮進行列印
*/
void printMaze()
{
int i=0,j=0;
printf(” “);
for(i=0;in;i++)
{
if(i+19)
printf(“%d “,i+1);
else
printf(” %d”,i+1);
}
printf(“\n”);
for(i=0;im;i++){
if(i+19)
printf(“%d”,i+1);
else
printf(” %d”,i+1);
for(j=0;jn;j++)
{
if(maze[i][j]==0||maze[i][j]==9||maze[i][j]==-1)
{
printf(“a “);
}
else if(maze[i][j]==1)
{
printf(“b “);
}else
if(maze[i][j]==2)
{
printf(“D “);
}else if(maze[i][j]==3)
{
printf(“X “);
}else if(maze[i][j]==4)
{
printf(“A “);
}else if(maze[i][j]==5)
{
printf(“W “);
}
}
printf(“\n”);
}
}
/*
*對迷宮進行路徑搜索
*數組的數字有以下含義
*0.該點沒有被探索過,且可行
*1.該點不可行
*2.該點是可行的,且進行了向東的探索
*3.該點是可行的,且進行了向南的探索
*4.該點是可行的,且進行了向西的探索
*5.該點是可行的,且進行了向北的探索
*6.該點是入口
*9.該點是出口
*-1.該點已經遍歷完畢四個方向,不能找到有效的路徑,則置為-1
*/
void FindPath()
{
int curx=0,cury=0;
int count=0;
int flag=0;
Node *Stacks=NULL;
InitStack(Stacks);
do{
if(maze[curx][cury]==9)
{
flag=1;
}
switch(pass(curx,cury)){
case 2:
maze[curx][cury]=2;
push(Stacks,curx,cury);
cury++;
break;
case 3:
maze[curx][cury]=3;
push(Stacks,curx,cury);
curx++;
break;
case 4:
maze[curx][cury]=4;
push(Stacks,curx,cury);
cury–;
break;
case 5:
maze[curx][cury]=5;
push(Stacks,curx,cury);
curx–;
break;
case -1:
maze[curx][cury]=-1;
if(!isEmpty(Stacks))
pop(Stacks,curx,cury);
break;
}
count++;
}while(!isEmpty(Stacks)flag==0);
if(flag==1)
{
printf(“該迷宮的行走路徑如下:\n”);
printMaze();
}else
{
printf(“\nSorry,該迷宮無解\n”);
}
}
/*
*主函數
*要求輸入m,n的值,要符合要求
*程序列印出生成的迷宮,然後進行尋找路徑
*如果可以找到出口,則畫出該路徑
*如果該迷宮沒有出口,則提示迷宮無解
*/
int main()
{
/*printf(“請輸入迷宮的行數m(大於0,小於100):”);
scanf(“%d”,m);
printf(“請輸入迷宮的列數n(大於0,小於100):”);
scanf(“%d”,n);
if(m0||m100||n0||n100){
printf(“輸入數據錯誤,程序退出\n”);
exit(-1);
}*/
InitMaze();
printf(“原迷宮為:\n”);
printMaze();
FindPath();
getch();
return 0;
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/245203.html