走迷宫
Time Limit: 1000MS Memory limit: 65536K
题目描述
有一个m*n格的迷宫(表示有m行、n列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,输入这m*n个数据和起始点、结束点(起始点和结束点都是用两个数据来描述的,分别表示这个点的行号和列号)。现在要你编程找出所有可行的道路,要求所走的路中没有重复的点,走时只能是上下左右四个方向。如果一条路都不可行,则输出相应信息(用-1表示无路)。
输入
第一行是两个数m,n(1< m, n< 15),接下来是m行n列由1和0组成的数据,最后两行是起始点和结束点。
输出
所有可行的路径,输出时按照左上右下的顺序。描述一个点时用(x,y)的形式,除开始点外,其他的都要用“->”表示。如果没有一条可行的路则输出-1。
示例输入
5 4 1 1 0 0 1 1 1 1 0 1 1 0 1 1 0 1 1 1 1 1 1 1 5 4
示例输出
(1,1)->(1,2)->(2,2)->(2,3)->(3,3)->(3,2)->(4,2)->(4,1)->(5,1)->(5,2)->(5,3)->(5,4) (1,1)->(1,2)->(2,2)->(2,3)->(3,3)->(3,2)->(4,2)->(5,2)->(5,3)->(5,4) (1,1)->(1,2)->(2,2)->(3,2)->(4,2)->(4,1)->(5,1)->(5,2)->(5,3)->(5,4) (1,1)->(1,2)->(2,2)->(3,2)->(4,2)->(5,2)->(5,3)->(5,4) (1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(3,2)->(4,2)->(4,1)->(5,1)->(5,2)->(5,3)->(5,4) (1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(3,2)->(4,2)->(5,2)->(5,3)->(5,4) (1,1)->(2,1)->(2,2)->(3,2)->(4,2)->(4,1)->(5,1)->(5,2)->(5,3)->(5,4) (1,1)->(2,1)->(2,2)->(3,2)->(4,2)->(5,2)->(5,3)->(5,4)
深搜+模拟,注意当前递归栈的visited标志使用过后要重置回来,还有要注意题目中“左上右下的顺序”...
#include <iostream> //#include <fstream> using namespace std; const int MAXN = 16; const int devide = 100; int maze[MAXN][MAXN]; int queue[MAXN*MAXN]; int visited[MAXN][MAXN]; int m,n,r,s; int flag; void dfs(const int& x,const int& y,const int& depth) { if(x == r && y == s) { if(!flag) flag = 1; for(int i = 0;i < depth;i ++) { int u = queue[i]; cout<<"("<<u/devide<<","<<u%devide<<")->"; } cout<<"("<<x<<","<<y<<")"<<endl; } else { int p = queue[depth] / devide; int q = queue[depth] % devide; //左上右下 if(q - 1 > 0 && maze[p][q-1] && !visited[p][q-1]) { queue[depth + 1] = p * devide + q - 1; visited[p][q - 1] = 1; dfs(p,q - 1,depth + 1); visited[p][q - 1] = 0; } if(p - 1 > 0 && maze[p-1][q] && !visited[p-1][q]) { queue[depth + 1] = (p - 1) * devide + q; visited[p-1][q] = 1; dfs(p-1,q,depth+1); visited[p-1][q] = 0; } if(q + 1 <= n && maze[p][q+1] && !visited[p][q+1]) { queue[depth + 1] = p * devide + q + 1; visited[p][q+1] = 1; dfs(p,q+1,depth + 1); visited[p][q+1] = 0; } if(p + 1 <= m && maze[p+1][q] && !visited[p+1][q]) { queue[depth + 1] = (p + 1) * devide + q; visited[p+1][q] = 1; dfs(p+1,q,depth+1); visited[p+1][q] = 0; } } } int main() { //ifstream cin("in.txt"); cin>>m>>n; for(int i = 1;i <= m;i ++) for(int j = 1;j <= n;j ++) cin>>maze[i][j]; int x,y; cin>>x>>y>>r>>s; queue[0] = x * devide + y; visited[x][y] = 1; dfs(x,y,0); if(!flag) cout<<-1<<endl; return 0; }