3623 - 【搜索与回溯】迷宫问题
设有一个N*N(2<=N<=10)方格的迷宫,入口和出口分别在左上角和右上角。迷宫格子中分别放有0和1,0表示可通,1表示不能,入口和出口处肯定是0。迷宫走的规则如下所示:即从某点开始,有八个方向可走,前进方格中数字为0时表示可通过,为1时表示不可通过,要另找路径。找出所有从入口(左上角)到出口(右上角)的路径,输出路径总数,如果无法到达,则输出0。
Input
第一行正整数N,
按下来是N*N的0、1迷宫矩阵,数之间用一个空格分隔。
Output
路径总数。
Examples
Input
3 0 0 0 0 1 1 1 0 0
Output
2
Solution C++
#include<iostream> using namespace std; const int N = 51; int map[N][N],book[N][N]; int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; int head=1,tail=1; int n,sx,sy,fx,fy,tx,ty,flag; struct queue { int x; int y; int s; }que[2501]; int main() { cin>>n; sx=1;sy=1;fx=1;fy=n; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cin>>map[i][j]; que[tail].x=1; que[tail].y=1; que[tail++].s=0; book[sx][sy]=1; flag=0; while(head<tail){ for(int i=0;i<=3;i++){ tx=que[head].x+dir[i][0]; ty=que[head].y+dir[i][1]; if(tx<1||tx>n||ty<1||ty>n) continue; if(map[tx][ty]==0&&book[tx][ty]==0){ book[tx][ty]=1; que[tail].x=tx; que[tail].y=ty; que[tail].s=que[head].s+1; tail++; } if(tx==fx&&ty==fy){ flag=1; break; } } if(flag==1) break; head++; } cout<<que[tail-1].s<<endl; return 0; }