計蒜客:bfs求解迷宮遊戲
題目描述:
蒜頭君在你的幫助下終於逃出了迷宮,但是蒜頭君並沒有沉浸於喜悅之中,而是很快的又陷入了思考,從這個迷宮逃出的最少步數是多少呢?
輸入格式
第一行輸入兩個整數 nn 和 mm,表示這是一個 n \times mn×m 的迷宮。
接下來的輸入一個 nn 行 mm 列的迷宮。其中 ‘S’ 表示蒜頭君的位置,’‘表示牆,蒜頭君無法通過,’.‘表示路,蒜頭君可以通過’.'移動,'T’表示迷宮的出口(蒜頭君每次只能移動到四個與他相鄰的位置——上,下,左,右)。
輸出格式
輸出整數,表示蒜頭君逃出迷宮的最少步數,如果蒜頭君無法逃出迷宮輸出 -1−1。
數據範圍
1 \le n, m \le 101≤n,m≤10。
輸出時每行末尾的多餘空格,不影響答案正確性
樣例輸入1
3 4
S**.
….
***T
樣例輸出1
-1
解題思路:
由題意得,求得最小步數。可以廣搜(bfs)也可以深搜(dfs)。但是深搜搜到即是最優解,且效率快得多了,因此使用廣搜(bfs)。
AC代碼:
#include <stdlib.h>
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <string.h>
#include <math.h>
#include <queue>
#include <vector>
using namespace std;
int n,m;
char map[100][100];
int vis[100][100];//標記是否訪問過
int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//四個方向的座標的變化量
bool in(int x,int y)//是否出界
{
return x>=0&&x<n&&y>=0&&y<m;
}
struct node
{
int x,y,step;
};
int bfs(int x,int y)
{
int i;
node start,next;//start爲起點的結點 ,next爲下一個要遍歷的結點
start.x=x;
start.y=y;
start.step=0;
queue<node>q;
q.push(start);
vis[x][y]=1;
while(!q.empty())
{
node now=q.front();
q.pop();
for(i=0;i<4;i++)
{
int xx=now.x+dir[i][0];
int yy=now.y+dir[i][1];
if(!in(xx,yy)||vis[xx][yy]||map[xx][yy]=='*')
continue;
vis[xx][yy]=1;
next.x=xx;
next.y=yy;
next.step=now.step+1;
if(map[xx][yy]=='T')//注意:廣搜,搜到即是最小值
return next.step;
q.push(next);
}
}
}
int main()
{
int i,j;
cin>>n>>m;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
cin>>map[i][j];
int x,y;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
if(map[i][j]=='S')//尋找地圖的起點
{
x=i;
y=j;
break;
}
cout<<bfs(x,y)<<endl;
return 0;
}