时间限制:1秒 内存限制:128M
题目描述
达达要穿过一片N*N(2<=N<10)的沼泽地,入口和出口分别在左上角和右下角。沼泽地中的路分别放0和1,0表示可以走的道路,1表示不能走的泥沼,入口和出口处肯定是0。沼泽地行走的规则如下所示:即从某点开始,有四个方向可走,前进方格中数字为0时表示可通过,为1时表示不可通过,要另找路径。 找出所有从入口(左上角)到出口(右下角)的路径(不能重复),输出路径总数,如果无法到达,则输出0。
输入描述
第一行输入一个整数N,代表沼泽的的边长。
第2-N+1行输入每行输入N个整数(0 1),用来描述沼泽地地形
输出描述
一个整数,代表所有不重复的路径数量
样例
输入
3 000 010 000
输出
2
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cstdio>
using namespace std;
int n,m,cnt,sx,sy;
const int N=1e2+10;
char a[N][N];
int vis[N][N];
int dx[]= {-1,1,0,0};
int dy[]= {0,0,-1,1};
void dfs(int x,int y ) {
vis[x][y]='1';
if(x==n&&y==n){
cnt++;
a[x][y]='0';
return;
}
for(int i=0; i<4; i++) {
int fx=x+dx[i];
int fy=y+dy[i];
if(!vis[fx][fy]&&a[fx][fy]=='0') {
dfs(fx,fy);
vis[fx][fy]=0;
}
}
}
int main() {
cin>>n;
memset(a,'1',sizeof(a));
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) {
cin>>a[i][j];
if(a[i][j]=='1'){
sx=i;
sy=j;
}
}
}
dfs(1,1);
cout<<cnt;
return 0;
}