游客 Signup | Login
中文 | En

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;
}
Time Limit 1 second
Memory Limit 128 MB
Discuss Stats
上一题 下一题