题目描述
农民John有很多牛,他想交易其中一头被Don称为The Knight的牛。
这头牛有一个独一无二的超能力,在农场里像Knight一样地跳(就是我们熟悉的象棋中马的走法)。
虽然这头神奇的牛不能跳到树上和石头上,但是它可以在牧场上随意跳,我们把牧场用一个x,y的坐标图来表示。
这头神奇的牛像其它牛一样喜欢吃草,给你一张地图,上面标注了The Knight的开始位置,树、灌木、石头以及其它障碍的位置,除此之外还有一捆草。
现在你的任务是,确定The Knight要想吃到草,至少需要跳多少次。
The Knight的位置用’K’来标记,障碍的位置用’*’来标记,草的位置用’H’来标记。
这里有一个地图的例子:
11 | . . . . . . . . . .
10 | . . . . * . . . . .
9 | . . . . . . . . . .
8 | . . . * . * . . . .
7 | . . . . . . . * . .
6 | . . * . . * . . . H
5 | * . . . . . . . . .
4 | . . . * . . . * . .
3 | . K . . . . . . . .
2 | . . . * . . . . . *
1 | . . * . . . . * . .
0 ----------------------
1
0 1 2 3 4 5 6 7 8 9 0
The Knight 可以按照下图中的A,B,C,D…这条路径用5次跳到草的地方(有可能其它路线的长度也是5):
11 | . . . . . . . . . .
10 | . . . . * . . . . .
9 | . . . . . . . . . .
8 | . . . * . * . . . .
7 | . . . . . . . * . .
6 | . . * . . * . . . F<
5 | * . B . . . . . . .
4 | . . . * C . . * E .
3 | .>A . . . . D . . .
2 | . . . * . . . . . *
1 | . . * . . . . * . .
0 ----------------------
1
0 1 2 3 4 5 6 7 8 9 0
注意: 数据保证一定有解。
输入格式
第1行: 两个数,表示农场的列数C(C<=150)和行数R(R<=150)。
第2..R+1行: 每行一个由C个字符组成的字符串,共同描绘出牧场地图。
输出格式
一个整数,表示跳跃的最小次数。
输入样例:
10 11
..........
....*.....
..........
...*.*....
.......*..
..*..*...H
*.........
...*...*..
.K........
...*.....*
..*....*..
输出样例:
5
算法1
(暴力枚举) $O(n * m)$
数据范围较小,且一定优解,简单bfs一下就可以了,~。~
C++ 代码
#include<iostream>
#include<cstring>
#include<algorithm>
#define pii pair<int,int>
using namespace std;
const int N = 155 , M = N * N;
char g[N][N];
int dist[N][N];
pii q[M];
int dx[8]={-1,-2,-2,-1,1,2,2,1},dy[8]={-2,-1,1,2,2,1,-1,-2};
bool st[N][N];
int sx,sy,ex,ey;
int m,n;
int bfs()
{
int tt=0,hh=0;
q[0]={sx,sy};
st[sx][sy] = true;
while(hh<=tt)
{
pii t = q[hh++];
for(int i=0;i<8;i++)
{
int a=t.first+dx[i];
int b=t.second+dy[i];
if(a>=0&&a<n&&b>=0&&b<n&&!st[a][b]&&g[a][b]!='*')
{
st[a][b]=true;
dist[a][b]=dist[t.first][t.second]+1;
if(a==ex&&b==ey) return dist[a][b];
q[++tt]={a,b};
}
}
}
return 0;
}
int main(){
//freopen("data.in","r",stdin);
//freopen("data.out","w",stdout);
scanf("%d%d",&m,&n);
for(int i=0;i<n;i++)
scanf("%s",g[i]);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
if(g[i][j]=='K') sx=i,sy=j;
if(g[i][j]=='H') ex=i,ey=j;
}
printf("%d\n",bfs());
return 0;
}