搜索_BFS_CH2906_武士风度的牛

版权声明:本文为博主原创作品, 转载请注明出处! https://blog.csdn.net/solider98/article/details/84324110

点此打开题目页面

思路分析: 直接使用BFS即可, 具体实现如下AC代码所示:

//CH2906_武士风度的牛
#include <iostream>
#include <cstdio>
#include <queue>
#include <algorithm> 
#include <cstring>
#define mp make_pair
#define fi first
#define se second
using namespace std;
typedef pair<int, int> pii;
const int MAX = 200;
const int dx[8] = {-1, -2, -2, -1, 1, 2, 2, 1}, dy[8] = {-2, -1, 1, 2, 2, 1, -1, -2};
char G[MAX][MAX]; int R, C, kx, ky, hx, hy;//kx牛所在行, ky所在列, hx:草所在行, hy:所在列 
int d[MAX][MAX];//d[i][j]从起始位置kx行, ky列跳到hx行, hy列的最少步数 
int main(){
	scanf("%d %d", &C, &R); for(int i = 1; i <= R; ++i) scanf("%s", G[i] + 1);
	//初始化kx, ky, hx, hy
	for(int i = 1; i <= R; ++i)
		for(int j = 1; j <= C; ++j){
			if(G[i][j] == 'K') kx = i, ky = j, G[i][j] = '.';
			if(G[i][j] == 'H') hx = i, hy = j, G[i][j] = '.';
		} 
	memset(d, 0x3f, sizeof(d)); queue<pii> qu; qu.push(mp(kx, ky)), d[kx][ky] = 0;
	while(!qu.empty()){
		int x = qu.front().fi, y = qu.front().se; qu.pop();
		for(int i = 0; i <= 7; ++i){
			int a = x + dx[i], b = y + dy[i];
			if(a >= 1 && a <= R && b >= 1 && b <= C && G[a][b] == '.' && d[x][y] + 1 < d[a][b])
				d[a][b] = d[x][y] + 1, qu.push(mp(a, b));
			
		}
	}
	cout << d[hx][hy] << endl;
} 

猜你喜欢

转载自blog.csdn.net/solider98/article/details/84324110