定义一个二维数组:
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)
分析:和前几题差不多,对于这种固定范围的搜索我总结了几个自己经常犯的错;
1.注意边界条件;
2.结构体里的y表示y中所以作为数组下标的时候y要在前面 eg:maze[next.y][next.x]
3.如果有多组数据需要注意初始化(poj和HDU是两个风格如果有相同的题一个AC了另一个不一定就能AC)
#include<cstdio>
#include<queue>
#include<iostream>
#include<cstring>
using namespace std;
struct point{
int x;
int y;
};
queue<point> q;
int maze[7][7]; //迷宫
int step[7][7]; //步长
bool visit[7][7]; //是否访问过
int bfs(){
memset(visit,false,sizeof(visit));
step[0][0]=0;
point init;
init.x=0;init.y=0;
visit[0][0]=true;
q.push(init); //初始化
while(!q.empty()){
point head=q.front();
q.pop();
for(int i=0;i<4;i++){
point next=head;
if(i==0) next.x=head.x+1; //right
else if(i==1) next.x=head.x-1; //left
else if(i==2) next.y=head.y+1; //down
else if(i==3) next.y=head.y-1; //up
if(next.x<0||next.x>4||next.y<0||next.y>4||(maze[next.y][next.x]==1)) continue; //越界处理
if(!visit[next.y][next.x]){
q.push(next);
step[next.y][next.x]=step[head.y][head.x]+1;
visit[next.y][next.x]=true;
}
if(next.x==4&&next.y==4){
return step[head.y][head.x];
}
}
}
}
int main(){
memset(maze,0,sizeof(maze));
memset(step,0,sizeof(step));
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
scanf("%d",&maze[i][j]);
}
}
bfs();
int c=0;
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
if(step[i][j]==c){
printf("(%d, %d)\n",i,j);
c++;
}
}
}
return 0;
}