YCOJ迷宫解的方案数

题目

Description

小信是一个玩迷宫的高手,天下还没有能难住他的迷宫。但是总有人喜欢刁难小信,不停的给小信出难题。这个出题的人很聪敏,他知道天下还没有能难住小信的迷宫。所以他便转换思维问小信,在不走重复路径的情况下,总共有多少不同可以到达终点的路径呢?小信稍加思索便给出了答案,你要不要也来挑战一下?


Input

第一行输入两个整数 n(1 ≤ n ≤ 11), m(1 ≤ m ≤ 11).表示迷宫的行和列。

然后有一个 n × m 的地图,地图由'.'、'#'、's'、'e'这四个部分组成。'.'表示可以通行的路,'#'表示迷宫的墙,'s'表示起始点,'e'表示终点。


Output

输出一个整数,表示从's'到达'e'的所有方案数。


Sample Input 1 

5 5
s####
.####
.####
.####
....e
Sample Output 1

1

一看这种关于迷宫的题,十有八九都是深搜(这不废话吗?)。

所以就开始DFS的老套路,4个方向轮番扩展,再把方案数加到一起,输出就行了。

话不多说,上代码:

#include <bits/stdc++.h>
using namespace std;
string mp[100];
int n,m,Tx,Ty,Sx,Sy;
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
bool in(int x,int y){
	return 0<=x&&x<n&&y>=0&&y<m;
}//判断边界
int vis[100][100];
int dfs(int x,int y){
	if (x==Tx&&y==Ty){
		return 1;
	}
	long long sum=0;
	vis[x][y]=1;
	for (int i=0;i<4;i++){
		int tx=x+dir[i][0];
		int ty=y+dir[i][1];//4个方向轮番扩展
		if (in(tx,ty)&&mp[x][y]!='#'&&!vis[tx][ty]){
			sum+=dfs(tx,ty);//把方案数加到一起
		}
	}
	vis[x][y]=0;//取消标记,因为万一这条路上还有可能呢?
	return sum;
}
int main(){
	cin >>n>>m;
	for(int i=0;i<n;i++){
		cin >> mp[i];
		for (int j=0;j<m;j++){
			if(mp[i][j]=='s'){
				Sx=i;
				Sy=j;
			}
			if(mp[i][j]=='e'){
				Tx=i;
				Ty=j;
			}
		}
    }
	cout << dfs(Sx,Sy);
	return 0;
}
    原文作者:迷宫问题
    原文地址: https://blog.csdn.net/qq_44635637/article/details/87347691
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞