信息奥赛一本通1254:走出迷宫

it2022-05-05  159

【题目描述】 当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单。

假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路。

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

接下来n行,每行一个长为m的字符串,表示整个迷宫的布局。字符‘.’表示空地,‘#’表示墙,‘S’表示起点,‘T’表示出口。

【输出】 输出从起点到出口最少需要走的步数。

【输入样例】 3 3 S#T .#. … 【输出样例】 6

广搜 代码如下:

//1254:走出迷宫 #include<iostream> using namespace std; int l,c,k,i,j,m,n,t; char map[101][101]; int num,que[10001][3];//que[i][0],广搜队列中第i个探索的横坐标x,que[i][1]纵坐标y,que[i][2]为到这个点走了共多少步 int soux,souy,desx,desy,head,tail;//记录队列 int dx[4]={-1,0,1,0}, dy[4]={0,1,0,-1};//坐标按上、右、下、左四个方向变化 int main() { cin>>m>>n; for(i=1;i<=m;i++) for(j=1;j<=n;j++) { cin>>map[i][j]; if(map[i][j]=='S') { soux=i; souy=j; } if(map[i][j]=='T') { desx=i; desy=j; } } head=0; tail=1; que[1][0]=soux;//将起始点入队 que[1][1]=souy; que[1][2]=0;//出发点不算一步 while(head<tail) { head++; int x1,y1; for(i=0;i<4;i++) { x1=que[head][0]+dx[i]; y1=que[head][1]+dy[i]; if(1<=x1&&x1<=m&&1<=y1&&y1<=n)//坐标不超出边界 if(map[x1][y1]=='.'||map[x1][y1]=='T')//找到了可以走的点,入队 { tail++; que[tail][0]=x1; que[tail][1]=y1; que[tail][2]=que[head][2]+1;//步数加1 map[x1][y1]='#';//走过的点变为不可通行的点 if(x1==desx&&y1==desy) { cout<<que[tail][2]<<endl; return 0; } } } } return 0; }

最新回复(0)