描述
输入
一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。
输出
左上角到右下角的最短路径,格式如样例所示。
样例输入
样例输出
定义一个二维数组:
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表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
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
(0, 0) (1, 0) (2, 0) (2, 1) (2, 2) (2, 3) (2, 4) (3, 4) (4, 4)
代码:
DFS:
#include<stdio.h>
int maze[10][10],TS_x[30],TS_y[30],ans_x[30],ans_y[30];
//TS暂存当前路径,ans存当前最短路径
int mov[4][2]={0,1,1,0,0,-1,-1,0},step_min;
//mov存移动方向,step_min存最小步数
void dfs(int x,int y,int step){
if(step>step_min)return;
TS_x[step]=x;
TS_y[step]=y;
int i;
if(x==4&&y==4){
if(step<step_min){
//后台就一组样例,所以试试会不会更新最短路径
// printf("%d\n",step);
//0 1 0 0 0
//0 0 0 1 0
//1 0 1 1 0
//1 0 0 0 0
//1 1 1 1 0
step_min=step;
for(i=0;i<step+1;i++){
ans_x[i]=TS_x[i];
ans_y[i]=TS_y[i];
}
}
return;
}
for(i=0;i<4;i++){
if(y+mov[i][1]<0||y+mov[i][1]>4||x+mov[i][0]<0||x+mov[i][0]>4||maze[x+mov[i][0]][y+mov[i][1]]==1)
continue;
maze[x+mov[i][0]][y+mov[i][1]]=1;
dfs(x+mov[i][0],y+mov[i][1],step+1);
maze[x+mov[i][0]][y+mov[i][1]]=0;
}
}
int main(){
int i,j;
for(i=0;i<5;i++)
for(j=0;j<5;j++)
scanf("%d",&maze[i][j]);
step_min=30;
maze[0][0]=1;
dfs(0,0,0);
for(i=0;i<step_min+1;i++)
printf("(%d, %d)\n",ans_x[i],ans_y[i]);
return 0;
}
BFS:
#include<stdio.h>
int maze[10][10],next[4][2]={0,1,1,0,0,-1,-1,0};
struct Queue{
int x,y,f;
}que[30],ans[30];
int main(){
int i,j,head=1,tail=1,dx,dy;
for(i=0;i<5;i++)
for(j=0;j<5;j++)
scanf("%d",&maze[i][j]);
que[tail].x=0;
que[tail].y=0;
que[tail].f=0;
maze[0][0]=1;
tail++;
while(head<tail){
for(i=0;i<4;i++){
dx=que[head].x+next[i][0];
dy=que[head].y+next[i][1];
if(dx<0||dx>4||dy<0||dy>4||maze[dx][dy]==1)
continue;
maze[dx][dy]=1;
que[tail].x=dx;
que[tail].y=dy;
que[tail].f=head;
tail++;
if(dx==4&&dy==4)break;
}
if(dx==4&&dy==4)break;
head++;
}
tail--;
j=0;
while(tail){
ans[j]=que[tail];
j++;
tail=que[tail].f;
}
while(j--){
printf("(%d, %d)\n",ans[j].x,ans[j].y);
}
return 0;
}