迷宫问题
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 18595 | Accepted: 11004 |
Description
定义一个二维数组:
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
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)
dfs的题目 求迷宫的最短路径
思路是 设置一个方向数组来控其行走的方向 若其该方向上的点满足条件则记录该点并标记且以该点为结点进行下一步搜索
若不满足条件 换另一方向重新进行 每当有一条路径到达终点 判断其步数是否小于之前最小路径 是则刷新最终路径数组
AC代码:
#include <stdio.h> #include <string.h> struct node{ int x; int y; }; node a[100];//记录最终路径 node tempa[100];//记录中间路径 int vis[10][10]; int dir[4][2]={1,0,0,1,-1,0,0,-1};//方向数组 int min=9999; int map[10][10]; void dfs(int x,int y,int step){ if (x==4&&y==4){ if (min>step){//找出最短路径 min=step; for (int i=0;i<step;i++){ a[i]=tempa[i]; } } return ; } for (int k=0;k<4;k++){ int i=x+dir[k][0]; int j=y+dir[k][1]; if (i>=0&&j>=0&&i<5&&j<5&&map[i][j]==0&&vis[i][j]==0){//判断条件 数组不越界 点未被访问过 可走的路0 tempa[step].x=i; tempa[step].y=j; vis[i][j]=1;//状态变化 dfs(i,j,step+1);//搜索 vis[i][j]=0;//状态还原 } } } int main (){ for (int i=0;i<5;i++){ for (int j=0;j<5;j++){ scanf ("%d",map[i]+j); } } memset(vis,0,sizeof(vis));//将迷宫中的所有点都标记为未被访问状态 vis[0][0]=1;//将初始位置标记为已被访问 dfs(0,0,0); printf ("(0, 0)\n"); for (int i=0;i<min;i++){ printf ("(%d, %d)\n",a[i].x,a[i].y); } return 0; }