【题目描述】
当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单。
假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路。
【输入】
第一行是两个整数n和m(1≤n,m≤100),表示迷宫的行数和列数。
接下来n行,每行一个长为m的字符串,表示整个迷宫的布局。字符‘.’表示空地,‘#’表示墙,‘S’表示起点,‘T’表示出口。
【输出】
输出从起点到出口最少需要走的步数。
【输入样例】
3 3 S#T .#. ...
【输出样例】
6
很简单的搜索题
bfs:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N = 1000001;
int n, m;
int u[2] = { -1,1 };
int vis[N];
int minn = N;
void dfs(int n, int step, int m)
{
cout << step << endl;
if (step >= minn) {
return;
}
for (int i = 0;i < 2;i++) {
int x = u[i] + n;
if (!vis[n] && x >= 0 && x < N) {
if (x == m) {
minn = min(minn, step);
//
//return;
}
vis[x] = 1;
dfs(x, step + 1, m);
vis[x] = 0;
}
}
int x = n * 2;
if (!vis[x] && x >= 0 && x < N) {
vis[x] = 1;
dfs(x, step + 1, m);
vis[x] = 0;
}
}
int main()
{
scanf("%d %d", &n, &m);
vis[n] = 1;
dfs(n, 0, m);
printf("%d\n", minn);
return 0;
}
dfs 一个特值判断还是超限得俩
#include<iostream>
#include<cstdio>
#include<queue>
#include<cmath>
using namespace std;
char mapp[500][500];
int n, m;
int a, b, c, d;
int v[4][2] = { {1,0},{-1,0},{0,1},{0,-1} };
int vis[500][500];
int minn = 500;
int viss[500][500];
void dfs(int x,int y,int step)
{
if (step >= minn||step>=viss[x][y]) return;
viss[x][y] = step;
if ((x == c) && (y == d)) {
minn = min(minn, step);
}
else
{
for (int i = 0;i < 4;i++) {
int xx = x+ v[i][0];
int yy = y + v[i][1];
if (xx >= 0 && xx < n&&yy >= 0 && yy < m && !vis[xx][yy]&&(mapp[xx][yy]=='.')) {
vis[xx][yy] = 1;
dfs(xx, yy, step + 1);
vis[xx][yy] = 0;
}
}
}
}
int main()
{
memset(viss, 0x3f3f3f3f, sizeof(viss));
scanf("%d %d", &n, &m);
for (int i = 0;i < n;i++) {
scanf("%s", mapp[i]);
}
// for (int i = 0;i < n;i++) cout << mapp[i] << endl;
for (int i = 0;i < n;i++) {
for (int j = 0;j < m;j++) {
if (mapp[i][j] == 'S') {
a = i;
b = j;
}
if (mapp[i][j] == 'T') {
c = i;
d = j;
mapp[i][j] = '.';
}
}
}
dfs(a,b,0);
printf("%d\n", minn);
return 0;
}