【题目描述】
当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单。
假设你已经得到了一个n×mn×m的迷宫的图纸,请你找出从起点到出口的最短路。
【输入】
第一行是两个整数nn和mm(1≤n,m≤1001≤n,m≤100),表示迷宫的行数和列数。
接下来nn行,每行一个长为mm的字符串,表示整个迷宫的布局。字符‘
.
’表示空地,‘#
’表示墙,‘S
’表示起点,‘T
’表示出口。【输出】
输出从起点到出口最少需要走的步数。
【输入样例】
3 3 S#T .#. ...【输出样例】
6#include<stdio.h> #include<queue> #include<string.h> int m, n; char c[100][100]; int xa, ya, xb, yb; bool vis[200][200]; int dir[][2] = { {1,0},{-1,0},{0,1},{0,-1} }; struct node { int x; int y; int step; }q[40000]; void bfs(int xa, int ya,int xb,int yb) { int head = 1, tail = 1; memset(vis, 0, sizeof(vis)); vis[xa][ya] = 1; q[tail].x = xa; q[tail].y = ya; q[tail].step = 0; tail++; while (head < tail) { int x = q[head].x; int y = q[head].y; int step = q[head].step; if (x == xb && y == yb) { printf("%d\n", step); break; } for (int i = 0; i < 4; i++) { int nx = x + dir[i][0]; int ny = y + dir[i][1]; if (nx >= 0 && nx < m && ny >= 0 && ny < n && c[nx][ny] == '.' && vis[nx][ny] == 0) { vis[nx][ny] = 1; q[tail].x = nx; q[tail].y = ny; q[tail].step = step + 1; tail++; } } head++; } } int main() { scanf("%d%d", &m, &n); for (int i = 0; i < m; i++) { getchar(); for (int j = 0; j < n; j++) { scanf("%c", &c[i][j]); if (c[i][j] == 'S') { xa = i; ya = j; } if (c[i][j] == 'T') { xb = i; yb = j; c[i][j] = '.'; } } } bfs(xa, ya, xb, yb); return 0; }
相关文章
- 10-111254:走出迷宫
- 10-11一本通 1215:迷宫
- 10-11一本通 1254:走出迷宫