K – 迷宫问题
定义一个二维数组:
int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, };
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。 Input 一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。 Output 左上角到右下角的最短路径,格式如样例所示。 Sample Input
0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0
Sample Output
(0, 0) (1, 0) (2, 0) (2, 1) (2, 2) (2, 3) (2, 4) (3, 4) (4, 4)
嘿嘿,继上一题之后开心了一丢丢,虽然很简单~~~~
代码:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>
#include <stack>
using namespace std;
struct Node{
int x,y;
};
struct Pass{
int x,y;
}s[8][8];
struct ST{
int m,n;
};
int dirx[4]={1,-1,0,0};
int diry[4]={0,0,1,-1};
int maze[8][8],book[8][8];//刚开始的初始化为0
void BFS()
{
Node beginn ={0,0};//设置开始的那个位置为1,1;
queue<Node>mq;
mq.push(beginn);
s[0][0].x=-1;
s[0][0].y=-1;
book[0][0]=1;
Node temp,endd;
while(mq.empty()==0)
{
temp=mq.front();
mq.pop();
for(int i=0;i<4;i++)
{
int fx=temp.x+dirx[i];
int fy=temp.y+diry[i];
if(fx<0||fy<0||fx>4||fy>4||book[fx][fy]==1||maze[fx][fy]==1)continue;
else
{
endd.x=fx;
endd.y=fy;
book[fx][fy]=1;
s[fx][fy].x=temp.x;
s[fx][fy].y=temp.y;
mq.push(endd);
if(endd.x==4&&endd.y==4) break;
}
}
}
}
int main()
{
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
scanf("%d",&maze[i][j]);
}//读入
BFS();
/* for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
printf("%d %d== ",s[i][j].x,s[i][j].y);
cout<<endl;
}
*/
stack<ST>ss;
ST gg;gg.m=4,gg.n=4;
ss.push(gg);
int a=4,b=4;
while(a!=-1&&b!=-1){
gg.m=s[a][b].x;
gg.n=s[a][b].y;
ss.push(gg);
int gg=a,kk=b;
a=s[gg][kk].x;
b=s[gg][kk].y;
}
ss.pop();
while(ss.empty()==0)
{
gg=ss.top();
ss.pop();
printf("(%d, %d)\n",gg.m,gg.n);
}
return 0;
}