沼泽地问题

时间限制: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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值