问题标题: 酷町堂:5012 走迷宫

0
0
已解决
张恩泽
张恩泽
高级天翼
高级天翼

5012   走迷宫

经验值:800 时间限制:1000毫秒

题目描述 Description

给出一个n行m列的二维迷宫,‘S’表示起点,‘T’ 表示终点,’#’ 表示墙壁,’.’ 表示平地。你需要从 ‘S’ 出发走到 ‘T’,每次只能上下左右走动,并且不能走出地图的范围以及不能走到墙壁上。请你计算出走到终点需要走的最少步数。

输入描述 Input Description

第一行输入n, m表示迷宫大小。
接下来输入n行字符串表示迷宫,每个字符串长度为m。(地图保证有且仅有一个终点,一个起始点)

输出描述 Output Description

输出走到终点的最少步数,如果不能走到终点输出−1

样例输入 Sample Input

2 3 S.# ..T

样例输出 Sample Output

3

数据范围及提示 Data Size & Hint

n,m<=15

 

 

错误代码,输出1061109567

//CODE
//#pragma GCC optimize(3)
//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
using namespace std;
int n, m, sx, sy, ex, ey;
int dir[4][2] = {{-1, 0}, {1, 0}, {0, 1}, {0, -1}};
bool G[20][20], vis[20][20];
int minn = 0x3f3f3f3f;
char s[20][20];
void dfs(int x, int y, int t) {
	if (x == ex && y == ey) {
		if (t < minn) {
			minn = t;
		}
		return ;
	}
	for (int i = 0; i < 4; i ++) {
		int nx = x + dir[i][0], ny = y + dir[i][1];
		if (nx >= 1 && nx <= n && ny >= 1 && ny <= m && !vis[nx][ny] && G[nx][ny]) {
			vis[nx][ny] = true;
			dfs(nx, ny, t + 1);
			vis[nx][ny] = false;
		}
	}
}
int main() {
//	freopen ("题目名.in", "r", stdin);
//	freopen ("题目名.out", "w", stdout);
	cin >> n >> m;
	for (int i = 1; i <= n; i ++) {
		for (int j = 1; j <= m; j ++) {
			cin >> s[i][j];
			if (s[i][j] == 'S') {
				sx = i;
				sy = j;
			}
			if (s[i][j] == 'T') {
				ex = i;
				ey = j;
			}
			if (s[i][j] == '.') {
				G[i][j] = true;
			}
		}
	}
	vis[sx][sy] = true;
	dfs(sx, sy, 1);
	vis[sx][sy] = false;
	cout << minn;
//	fclose (stdin);
//	fclose (stdout);
	return 0;//好习惯!
}

这种题太ex了

张恩泽在2021-06-15 12:39:16追加了内容

help!!


0
已采纳
陈梓恒
陈梓恒
初级守护
初级守护

定义f=1;

if(x==ex&&y=ey)

加个t=0;f=0;

最后判断

if(!f)cout<<minn;

else cout<<-1;

我要回答