dfs寻找几条路径以及输出路径

请帮他判断能否出走出迷宫,如果可能,则输出一共有多少种不同的走法(对于某种特定的走法,必须保证不能多次走到同一个位置)。如果不能走到出口,则输出impossible。每次走只能是上、下、左、右4个方向之一。
输入格式:
测试数据有多组,处理到文件尾。每组测试数据首先输入2个整数n,m(0<n,m≤100),代表迷宫的高和宽,然后n行,每行m个字符,各字符的含义如下: 'S’代表小明现在所在的位置;‘T’代表迷宫的出口;’#‘代表墙,不能走;’.'代表路,可以走。

输出格式:
对于每组测试,输出一共有多少种不同的走法,若不能走出则输出impossible。
输入样例:

4 4
S...
#..#
..#.
...T

输出样例:
4

#include<iostream>
#include<stack>
using namespace std;
char maze[100][100];
int vis[100][100];//判断是否已经走过
int n, m, dx, dy;
int dir[4][2] = { {0,1},{0,-1},{1,0},{-1,0} };
struct point {
	int x, y;
} p;
stack<point> path, temp;
int count1 = 0;
void dfs(int x, int y) {
	if (x == dx && y == dy) {
		cout << "******************路径" << ++count1 << "******************" << endl;
		while (!path.empty()) {
			point p1 = path.top();
			path.pop();
			temp.push(p1);
		}
		while (!temp.empty()) {
			point p1 = temp.top();
			temp.pop();
			path.push(p1);
			cout << "(" << p1.x << "," << p1.y << ")" << endl;
		}
		return;
	}
	if (x < 0 || x > n || y < 0 || y > m)	return;
	for (int i = 0; i < 4; i++) {
		int nx = x + dir[i][0];
		int ny = y + dir[i][1];
		if (0 <= nx && nx < n && 0 <= ny && ny < m && (maze[nx][ny] == '.' || maze[nx][ny] == 'T') && vis[nx][ny] == 0) {
			vis[nx][ny] = 1;
			p.x = nx;
			p.y = ny;
			path.push(p);
			dfs(nx, ny);
			vis[nx][ny] = 0;
			path.pop();
		}
	}
}
int main() {
	while (cin >> n >> m) {
		count1 = 0;
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				cin >> maze[i][j];
				if (maze[i][j] == '.') vis[i][j] = 0;
				else if (maze[i][j] == '#') vis[i][j] = 1;
				else if (maze[i][j] == 'S') {
					p.x = i;
					p.y = j;
					path.push(p);
					vis[i][j] = 1;
				}
				if (maze[i][j] == 'T') {
					dx = i;
					dy = j;
					vis[i][j] = 0;
				}
			}
		}
		point a = path.top();
		dfs(a.x, a.y);
		if (count1 != 0) cout << count1 << endl;
		else cout << "impossible" << endl;
	}
	return 0;
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值