站外题求助
  • 板块学术版
  • 楼主QWQ_jyc
  • 当前回复15
  • 已保存回复15
  • 发布时间2023/7/5 22:09
  • 上次更新2023/11/3 11:24:59
查看原帖
站外题求助
760850
QWQ_jyc楼主2023/7/5 22:09

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

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

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

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

∗* 代表这个地方有障碍物,是不可走的。

AA 代表大A的初始位置。

BB 代表大B的初始位置。

输入格式 第一行 22 个整数,NN 和 TT ,空格隔开。

接下来的 NN 行,每行 $N4 个字符,表示 大A 画的地图。

接下来的 TT 行,每行 22 个整数xx和yy,表示 大B 在每个时间单位时的位置。

输出格式 第一行一个整数 KK ,表示 大A 最短可以在过了 KK 个单位时间后 获胜,如果他不可以在 大B 胜利前获胜,那么请输出 −1-1。

输入输出样例 输入 #1

5 3
.  *  *  *  *
*  .  .  B  .
A  .  *  *  *
*  *  *  *  *
.  .  .  .  .
2 3
2 2

输出 #1

2

说明/提示

样例解释#1:

大A 移动路径:

3 1 -> 3 2 -> 2 2

大B 移动路径:

2 4 -> 2 3 -> 2 2,

因此最短时间为

2

。

提示:为了游戏的可玩性,所以他们规定 大A 走过的路不可再走。

对于所有数据

5≤N≤100,1≤T≤10005 ≤ N ≤ 100 , 1 ≤ T ≤ 1000

#include <bits/stdc++.h>
using namespace std;
char a[1005][1005];
int b1[1005],b2[1005],b[1005][1005],fx[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
bool v[1005][1005];
int n,ax,t,ay,bx,e,by,s;
queue<int>qx,qy;
void f(){
	int j;
	qx.push(ax);
	qy.push(ay);
	a[ax][ay]=0;
	v[ax][ay]=true;
	while(!qx.empty()){
		int x=qx.front(),y=qy.front();
		qx.pop();
		qy.pop();
		if(j<=t){
			bx=b1[j];
			by=b2[j];
		}
		for(int i=0;i<4;i++){
            e=0;
			int nx=x+fx[i][0];
			int ny=y+fx[i][1];
			if(nx>0&&ny>0&&nx<=n&&ny<=n&&a[nx][ny]!='*'&&!v[nx][ny]){
				v[nx][ny]=true;
				b[nx][ny]=b[x][y]+1;
				qx.push(nx);
				qy.push(ny);
			}
		}
	}
	cout<<b[bx][by];
	return;
}
int main(){
	cin>>n>>t;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>a[i][j];
			if(a[i][j]=='A'){
				ax=i;
				ay=j;
			}else if(a[i][j]=='B'){
				bx=i;
				by=j;
			}
		}
	}
	for(int i=1;i<=t;i++){
		cin>>b1[i]>>b2[i];
	}
	f();	
	return 0;
}
2023/7/5 22:09
加载中...