SCU-4396 麥野沉利與御阪美琴的戰鬥

4396: 麥野沉利與御阪美琴的戰鬥

Submit your solution     Discuss this problem     Best solutions

描述

麥姐辛苦建立的實驗室被入侵了,而且入侵者已經到達最後一個。但是這個入侵者居然是level5的御阪美琴!!但是同爲level5的麥姐怎麼能退縮呢!!

御阪美琴是學園都市名門貴族女校常盤臺中學二年級生,有着一頭及肩的茶色髮絲、同樣是茶色的瞳孔。同時她也是學院都市排名第三位的超能力者。能力名爲“超電磁炮”,能夠隨意操縱十億伏特高壓電流、電磁波和磁力。 作爲item組織的頭頭,自己的實驗室被偷襲,爲了保護好自己的部下。必須殊死搏鬥。

根據同伴芙蘭達的情報,麥姐發現整個實驗室包含了n*m個房間,如下圖
######
#p***#
###**#
#m***#
###**#
其中#表示該房間已經被可惡的御阪美琴給破壞了,不能通過;
而*表示還完好的房間。
p則表示御阪美琴現在的位置,m表示麥姐現在的位置。
麥姐每次都可以向四周移動一個房間,當然她不會離開實驗室。
現在麥姐必須儘快趕到御阪美琴所在的房間,擊潰她!
大戰之前,麥姐必須把全部精力用來戰鬥,現在請你幫助麥姐計算一下她最少需要移動幾個房間才能到御阪美琴的房間。

Input

第一行一個整數T,代表樣例總數。
之後每組數據格式爲
第一行爲n m,表示實驗室的大小(n, m小於等於200大於0)
之後的n行表示整個實驗室的地圖。

Output

對於每組樣例,輸出一個整數F代表麥姐最少需要走多少個房間,如果沒有道路通向炮姐所在房間,輸出-1。

Example Input

2
5 5
m****
**#**
**#**
*#***
**#p*
10 10
********#*
**#*******
#*#*#*****
*##*#*****
#**#***#**
****#***#*
#**m*#****
*****#p***
#*********
***#*##***

Example Output

7
6

Author

qw4990
一道求最短路徑的題,毫無懸念用BFS了。先創建二維字符數組存數據,掃描到字母m或p就記錄當前座標,分別表示起點和終點,創建一個int類型的step[maxn][maxn]數組並初始化爲0,一個bool類型的visit數組用來存儲當前地圖點是否被訪問過的數據。數據讀入完成後開始BFS,起點爲字母m所在地,每次有四種走法,每開始一種走法,判斷是否撞牆(房屋被毀),如果撞牆則不能走,如果沒有撞牆且座標合法(不要跑到地圖外去了)

next.x >= 0 && next.x< N && next.y >= 0 && next.y< M
則判斷目前是不是到了終點,如果到達終點,輸出step數組中對應的值,否則加入隊列,繼續下一次搜索,函數執行完成後,如果終點是可以到達的,那麼step一定不爲零,反之step爲零,最終輸出結果加一個判斷條件如果步數爲0則輸出-1,否則輸出所需最短步數即可。

#include<iostream>
#include<cstring>
#include<queue>
#define MAX 200+5
using namespace std;
struct node
{
	int x, y;
};
char maze[MAX][MAX + 1] = { 0 };
bool visit[MAX][MAX + 1] = { false };
int step[MAX][MAX + 1] = { 0 };
int dir[4][2] = { { -1,0 },{ 1,0 },{ 0,-1 },{ 0,1 } };
int sx, sy, ex, ey;
int N, M;
queue <node> que;
void BFS(int x, int y)
{
	node q;
	q.x = x; q.y = y;
	que.push(q);
	while (!que.empty())
	{
		node now = que.front();
		node next;
		que.pop();
		for (int i = 0; i<4; i++)
		{
			next.x = now.x + dir[i][0];
			next.y = now.y + dir[i][1];
			if (next.x >= 0 && next.x< N && next.y >= 0 && next.y< M && maze[next.x][next.y] != '#' && visit[next.x][next.y] == false)
			{
				visit[next.x][next.y] = true;
				step[next.x][next.y] = step[now.x][now.y] + 1;
				que.push(next);
			}
		}
	}
}
int main()
{
    int t;
    cin >> t;
    while(t--)
    {
        while(cin >>N >> M)
        {
            memset(maze,0,sizeof(maze));
            memset(step,0,sizeof(step));
            memset(visit,false,sizeof(visit));
            for (int i = 0; i<N; i++)
                for (int j = 0; j<M; j++)
                    {
                        cin >> maze[i][j];
                        if (maze[i][j]=='p')
                        {
                            ex=i;ey=j;
                        }
                    }
            for (int i = 0; i<N; i++)
                for (int j = 0; j<M; j++)
                {
                    if (maze[i][j] == 'm')
                        {
                            BFS(i,j);
                            if(step[ex][ey]!=0)    cout << step[ex][ey] << endl;
                            else cout << "-1" << endl;
                        }
                }
        }
    }
    return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章