题目:
https://www.luogu.com.cn/problem/P10491?contestId=217365
题目背景
农民 John 有很多牛,他想交易其中一头被 Don 称为 The Knight 的牛。这头牛有一个独一无二的超能力,在农场里像 Knight 一样地跳(就是我们熟悉的象棋中马的走法)。虽然这头神奇的牛不能跳到树上和石头上,但是它可以在牧场上随意跳,我们把牧场用一个 x,y 的坐标图来表示。
题目描述
这头神奇的牛像其它牛一样喜欢吃草,给你一张地图,上面标注了 The Knight 的开始位置,树、灌木、石头以及其它障碍的位置,除此之外还有一捆草。现在你的任务是,确定 The Knight 要想吃到草,至少需要跳多少次。The Knight 的位置用 K
来标记,障碍的位置用 *
来标记,草的位置用 H
来标记。
这里有一个地图的例子:
思路简单的bfs模版,方向数组改成八个就可以。
代码如下:
#include <iostream>
#include<algorithm>
#include<queue>
using namespace std;
int dx[8]={-1,-2,-2,-1,1,2,2,1};
int dy[8]={2,1,-1,-2,2,1,-1,-2};//马走8个方向
struct Node{
int x;
int y;
int step;
};
bool stl[1005][1005];
char map[1005][1005];
int n,m;
int startx,starty;
int endx,endy;
int main()
{
queue <Node> q;
cin >> m >> n;
for(int i = 1 ; i <= n ; i++)
{
for(int j = 1 ; j <= m ; j++)
{
cin >> map[i][j];
if(map[i][j] == 'K')
{
startx = i;
starty = j;
}
if(map[i][j] == 'H')
{
endx = i;
endy = j;
}
}
}
Node start = {startx,starty,0};
q.push(start);
stl[startx][starty] = true;//标记已走过
while(!q.empty())
{
int x = q.front().x;//取出队首的三个数据
int y = q.front().y;
int step = q.front().step;
if(x == endx && y == endy)
{
cout << step << endl;
break;
}
for(int k = 0 ; k < 8 ; k++)
{
int tx = x + dx[k];
int ty = y + dy[k];
if(tx >= 1 && tx <= n && ty >= 1 && ty <= m && stl[tx][ty] == false && map[tx][ty] != '*' )
{
stl[tx][ty] = true;//标记已访问
Node newpos ={tx,ty,step+1};
q.push(newpos);
}
}
q.pop();
}
return 0;
}