BFS和Dijkstra結合

某朝發表於2024-11-28

Description

資料結構與演算法實驗題 Sins of a Solar EmpireP6

★實驗任務

正如你所知道的s_sin是一個貪玩的不得了的小P孩QAQ,你也知道他最近很喜歡玩一個叫做太陽帝國的原罪的策略遊戲去年
他已經和瘋狂的AI交戰了整整一年。而現在,戰鬥的序幕又要拉開了。

在某個星球上,該星球由n*m個方格組成,每個方格中可能為boss,s_sin,障礙,道路,小怪。s_sin想要去打爆boss,假
設他可以秒殺boss,現在他的任務只需要到達boss所在的位置。如果s_sin想要到達某個方格,但方格中有小怪,那麼必須
打死小怪,才能到達這個方格。假設s_sin只能向上、下、左、右移動一個格子,移動一步用時1個時間單位,殺死小怪也用
1個時間單位。假設s_sin很強壯,可以殺死所有小怪。

試計算s_sin到達boss位置至少需要多少時間。注意:障礙是不能透過的。

Input

★資料輸入

輸入第一行為兩個正整數n,m (1 < =n,m< =100), 表示該地圖有n行m列。

接下來n行,每行m個字元:“.”代表道路 , “a”代表boss , “r”代表s_sin ,“#”代表障礙,“x”代表小怪。

Output

★資料輸出

如果s_sin能到達boss位置則輸出所需的最少時間。如果無法達到,則輸出-1

Sample Input

5 5
.....
.....
axxxr
.....
.....

Sample Output

6

Sample Input

7 8

.#####.

.a#..rx

..#x.x.

..#..#.#

...##..

.#......
........

Sample Output

13

思路

#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#define M 0x3f3f3f
using namespace std;
typedef pair<int, int>PII;
const int N = 110;
int n, m;
int a, b;//起點
int c, d;//終點
char map[N][N];
int dist[N][N];
int dx[4] = { -1,1,0,0 };
int dy[4] = { 0,0,-1,1 };

void bfs(int x, int y)
{
	
	queue<PII>q;
	q.push({ x,y });

	dist[x][y] = 0;
	map[x][y] = '#';
	while (q.size())
	{
		
		auto u = q.front();
		q.pop();

		if (map[u.first][u.second] == 'a')
		{
			c = u.first, d = u.second;
			
			//return;
		}

		for (int i = 0; i < 4; i++)
		{
			int nx = u.first + dx[i]; int ny = u.second + dy[i];
			if (nx < 0 || nx >= n || ny < 0 || ny >= m)continue;
			if (map[nx][ny] == '#' )continue;

			int cmp = dist[u.first][u.second];

			if (map[nx][ny] == 'x')
			{
				if (dist[nx][ny] > cmp + 2) {
					dist[nx][ny] = cmp + 2;
					q.push({ nx,ny });
				}
			}
			else
			{
				if (dist[nx][ny] > cmp + 1) {
					dist[nx][ny] = cmp + 1;
					q.push({ nx,ny });
				}
				
			}
			
		}
		
	}
}

int main() {
	cin >> n >> m;

	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			cin >> map[i][j];
			if (map[i][j] == 'r')
			{
				a = i, b = j;
			}
			dist[i][j] = M;
		}
	}
	bfs(a, b);
	
	if (dist[c][d] == -1)cout << -1 << endl;
	else cout << dist[c][d] << endl;
}
/*
7 8
#.#####.
#.a#..rx
#..#x.x.
..#..#.#
#...##..
.#......
........
*/

相關文章