迷宫问题
时间限制: 1 Sec 内存限制: 128 MB提交: 13 解决: 9
[ 提交][ 状态][ 讨论版]
题目描述
设有一个N*N方格的迷宫,入口和出口分别在左上角和右上角。迷宫格子中分别放有0和1,0表示可通,1表示不能,
迷宫走的规则如下图所示:即从某点开始,有八个方向可走,前进方格中数字为0时表示可通过,为1时表示不可通过,
要另找路径。找出一条 从入口(左上角)到出口(又上角)的路径(每个格子只能走一次)。
输入
只有一组输入数据。输入如下面样例,且1<N<15
输出
输出可行的路径总数。如果无法到达,输出0。
样例输入
3
0 0 0
0 1 1
1 0 0
样例输出
2
简单搜索
#include<stdio.h>
int map[20][20],N,visit[20][20],ans=0;
void dfs(int x,int y)
{
if(x==0&&y==N-1)
ans++;
visit[x][y]=1;
if(x-1>=0&&map[x-1][y]==0&&visit[x-1][y]==0)//向上
dfs(x-1,y);
if(x+1<N&&map[x+1][y]==0&&visit[x+1][y]==0)//向下
dfs(x+1,y);
if(y-1>=0&&map[x][y-1]==0&&visit[x][y-1]==0)//向左
dfs(x,y-1);
if(y+1<N&&map[x][y+1]==0&&visit[x][y+1]==0)//向右
dfs(x,y+1);
if(x-1>=0&&y-1>=0&&map[x-1][y-1]==0&&visit[x-1][y-1]==0)//左上角
dfs(x-1,y-1);
if(x-1>=0&&y+1<N&&map[x-1][y+1]==0&&visit[x-1][y+1]==0)//右上角
dfs(x-1,y+1);
if(x+1<N&&y-1>=0&&map[x+1][y-1]==0&&visit[x+1][y-1]==0)//左下角
dfs(x+1,y-1);
if(x+1<N&&y+1<N&&map[x+1][y+1]==0&&visit[x+1][y+1]==0)//右下角
dfs(x+1,y+1);
visit[x][y]=0;
}
int main()
{
scanf("%d",&N);
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
{
scanf("%d",&map[i][j]);
visit[i][j]=0;
}
dfs(0,0);
printf("%d\n",ans);
return 0;
}