迷宫问题
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 6113 | Accepted: 3540 |
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) 接着上一遍博客说,上一篇用了BFS,由于本题数据量比较小,用两种方法差不多,主要是训练一下两种搜索方式的思想和写法,注意DFS要回溯,要恢复变量的原状态。#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <ctime> #include <queue> #include <stack> #include <vector> #include <algorithm> #include <string> using namespace std; #define forl(i,a,b) for(int i=(a);i<(b);++i) #define forle(i,a,b) for(int i=(a);i<=(b);++i) #define forg(i,a,b) for(int i=(a);i>(b);--i) #define forge(i,a,b) for(int i=(a);i>=(b);--i) #define mes(a,v) memset(a, v, sizeof (a) ); #define cpy(a,b) memcpy(a, b, sizeof (a) ); #define mesn(a, v, n) memset(a, v, (n)*sizeof((a)[0])) #define cpyn(a, b, n) memcpy(a, v, (n)*sizeof((a)[0])) const int dx[]={1,0,0,-1}; const int dy[]={0,1,-1,0}; int maze[10][10],visit[10][10]; struct Node { int x,y; }; vector<Node>v; bool Dfs(int x,int y) { Node tmp; tmp.x=x,tmp.y=y; v.push_back(tmp); visit[x][y]=1; if(x==4&&y==4) return true; for(int i=0;i<4;i++) { int nex=x+dx[i]; int ney=y+dy[i]; if(!visit[nex][ney]&&!maze[nex][ney]&&nex>=0&&nex<5&&ney>=0&&ney<5) { if(Dfs(nex,ney)) return true; v.pop_back(); //返回原状态 visit[nex][ney]=0; //返回原状态 } } return false; } int main() { //freopen("in.txt","r",stdin); int i,j; for(i=0;i<5;i++) for(j=0;j<5;j++) scanf("%d",&maze[i][j]); Dfs(0,0); for(i=0;i<v.size();i++) printf("(%d, %d)\n",v[i].x,v[i].y); return 0; }
本文介绍如何使用深度优先搜索(DFS)和广度优先搜索(BFS)解决迷宫问题,通过一个具体的例子展示了如何从左上角到达右下角的最短路径,并提供了解决该问题的C++代码实现。

1664

被折叠的 条评论
为什么被折叠?



