計蒜客:迷宮(二)---bfs

計蒜客: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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章