188.武士风度的牛
总结:
先找到进入floodfill的条件
然后加入把起点加入队列并进行标记
只要队列不空就对格子进行扩展(要除去自己因为自己已经被覆盖过了)
然后判定是否有效(是否超出范围,是否已经覆盖或者是石头)
把扩展的点加入队列并进行标记
然后从已经加入的队列里的数随机选一个再次进行扩展
就是不只是四个方向
走的是一个日字
#include<iostream>
#include<cstring>
using namespace std;
const int N=155;
#define x first
#define y second
typedef pair<int,int> PLL;//存下标
PLL p[N*N];
char g[N][N];
int n,m;
int dist[N][N];//距离
int bfs()
{
int sx,sy;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(g[i][j]=='K')//标记
sx=i,sy=j;
p[0]={sx,sy};
int hh=0,tt=0;
memset(dist,-1,sizeof dist);//表示没有走过
dist[sx][sy]=0;
int dx[8]={-2,-1,1,2,2,1,-1,-2},dy[8]={1,2,2,1,-1,-2,-2,-1};//走日的方向
while(hh<=tt)
{
PLL t=p[hh++];
for(int i=0;i<8;i++)//遍历周围8个方向
{
int a=t.x+dx[i],b=t.y+dy[i];
if(a<0||a>=n||b<0||b>=m) continue;//处理越界
if(g[a][b]=='*')continue;//障碍物
if(dist[a][b]!=-1) continue;//已经走过
if(g[a][b]=='H') return dist[t.x][t.y]+1;//吃到了草的话
p[++tt]={a,b};//加入队列
dist[a][b]=dist[t.x][t.y]+1;//更新距离
}
}
return -1;
}
int main()
{
cin>>m>>n;
for(int i=0;i<n;i++)
cin>>g[i];
cout<<bfs()<<endl;
}