【编程入门】迷宫的路径数量
内存限制:128 MB
题目描述
设有一个N*N方格的迷宫,入口和出口分别在左上角和右上角。
迷宫格子中分别放有0和1,0表示可通,1表示不能,
迷宫走的规则如下:
即从某点开始,有八个方向可走,前进方格中数字为0时表示可通过,为1时表示不可通过,要另找路径。
找出从入口(左上角)到出口(右上角)的路径(不能重复)。输出路径总数。如果无法到达,输出0。
输入
第1行有一个整数N,表示迷宫大小(2≤N≤10)
接下来N行,每行有N个数
输出
输出一个整数,代表迷宫从起点到终点的路径条数。
样例输入 复制
3
0 0 0
0 1 1
1 0 0
样例输出 复制
2
这道题只要在dfs的路上每个点到达的数量记录下来。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,g,a[105][105],s[105][105],x,y,l,r;
string st;
ll dx[10]={0,0,0,1,-1,1,1,-1,-1};
ll dy[10]={0,1,-1,0,0,1,-1,1,-1};
void dfs(ll x,ll y)
{
a[x][y]=1;
for(ll i=1;i<=8;i++)
{
ll xx=x+dx[i],yy=y+dy[i];
if(xx>=1&&xx<=n&&yy>=1&&yy<=n&&a[xx][yy]==0)
{
s[xx][yy]++;
dfs(xx,yy);
}
}
a[x][y]=0;
}
void solve(){
cin>>n;
for(ll i=1;i<=n;i++)
{
for(ll j=1;j<=n;j++)
{
cin>>a[i][j];
}
}
x=1,y=1,l=1,r=n;
s[1][1]=0;
dfs(x,y);
cout<<s[l][r];
}
int main()
{
solve();
return 0;
}