问题描述
设有一个 N×N(2≤N<10)方格的迷宫,入口和出口分别在左上角和右上角
迷宫格子中分别放0 和 1,0 表示可通,1 表示不能,入口和出口处肯定是00
迷宫走的规则如下所示:
从某点开始,有八个方向可走,前进方格中数字为 0 时表示可通过,为 1 时表示不可通过
找出所有从入口(左上角)到出口(右上角)的路径(不能重复),输出路径总数,如果无法到达,则输出 0
输入格式
第一行输入一个整数N
接下来N行N列,输出一个0/1矩阵
输入样例
3
0 0 0
0 1 1
1 0 0
输出样例
2
思路:
用DFS,注意回溯
AC代码:
cpp
#include <bits/stdc++.h>
using namespace std;
int dir[][2]={0,1,0,-1,1,0,-1,0,-1,-1,-1,1,1,-1,1,1};
bool vis[15][15];
int mat[15][15],cnt=0,n;
void dfs(int r,int c)
{
if(r==1&&c==n)
{
cnt++;
return;
}
for(int i=0;i<8;i++)
{
int dr=r+dir[i][0],dc=c+dir[i][1];
if(dr>=1&&dc>=1&&dr<=n&&dc<=n&&!mat[dr][dc]&&!vis[dr][dc])
{
vis[dr][dc]=true;
dfs(dr,dc);
vis[dr][dc]=false;
}
}
}
int main()
{
cin >> n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin >> mat[i][j];
}
}
vis[1][1]=true;
dfs(1,1);
cout<<cnt;
return 0;
}