异常终止求调玄关
  • 板块灌水区
  • 楼主Atwi_llljx
  • 当前回复5
  • 已保存回复5
  • 发布时间2023/7/26 14:53
  • 上次更新2023/11/3 07:34:07
查看原帖
异常终止求调玄关
886208
Atwi_llljx楼主2023/7/26 14:53

题目背景 预言家 大A 和 大B 在玩抓人游戏,大A每一个时间单位均移动一个单位,如果 大A 在某个单位时间与 大B 站在一起,那么 大A 就获胜,若T个时间单位后,大A 没获胜则 大B 获胜。但是 大A 是预言家,因此他能够预判 大B 的行动轨迹。

题目描述 大B 在一个边长为 N 的正方形迷宫内。大A 想让你帮他算算,他最短可以在几个单位时间后获胜。

大A 把这个房间的地图用符号画了出来,他规定:

. 代表这个地方是没有障碍的。

  • 代表这个地方有障碍物,是不可走的。 A 代表大A的初始位置。 B 代表大B的初始位置。 输入格式 第一行 2 个整数,N 和 T ,空格隔开。

接下来的 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;
}
2023/7/26 14:53
加载中...