题目背景 预言家 大A 和 大B 在玩抓人游戏,大A每一个时间单位均移动一个单位,如果 大A 在某个单位时间与 大B 站在一起,那么 大A 就获胜,若T个时间单位后,大A 没获胜则 大B 获胜。但是 大A 是预言家,因此他能够预判 大B 的行动轨迹。
题目描述 大B 在一个边长为 N 的正方形迷宫内。大A 想让你帮他算算,他最短可以在几个单位时间后获胜。
大A 把这个房间的地图用符号画了出来,他规定:
. 代表这个地方是没有障碍的。
接下来的 N 行,每行 N 个字符,表示 大A 画的地图。
接下来的 T 行,每行 2 个整数x和y,表示 大B 在每个时间单位时的位置。
输出格式 第一行一个整数 K ,表示 大A 最短可以在过了 K 个单位时间后 获胜,如果他不可以在 大B 胜利前获胜,那么请输出 -1。
/*
*/
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int A[100]={0,-1,1},B[100]={0,0,0,-1,1};
int n,t,bx[10100],by[10100];
char s[11000][11000];
bool dx[11000][11000];
struct a1{
int xx,yy,bs;
}qq,qqq;
queue<a1> q;
int main(){
scanf("%d%d",&n,&t);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
cin>>s[i][j];
switch(s[i][j]){
case 'A':
qq.xx=i;
qq.yy=j;
break;
case 'B':
bx[0]=i;
by[0]=j;
break;
}
}
dx[qq.xx][qq.yy]=1;
for(int i=1;i<=t;scanf("%d%d",&bx[i],&by[i]),i++);
q.push(qq);
for(;qq.bs<=t;){
qq=q.front();
q.pop();
if(qq.xx==bx[qq.bs]&&qq.yy==by[qq.bs]){
printf("%d",qq.bs);
return 0;
}
qq.bs++;
for(int i=1;i<=4;i++){
int xxx=qq.xx+A[i],yyy=qq.yy+B[i];
if(xxx<1||yyy<1||xxx>n||yyy>n)
continue;
if(dx[xxx][yyy]==0&&s[xxx][yyy]!='*'){
dx[xxx][yyy]=1;
qqq=qq;
qqq.xx=xxx;
qqq.yy=yyy;
q.push(qqq);
}
}
}
printf("-1");
return 0;
}