列表

详情


NC15445. wyh的吃鸡

描述

最近吃鸡游戏非常火,你们wyh学长也在玩这款游戏,这款游戏有一个非常重要的过程,就是要跑到安全区内,否则就会中毒持续消耗血量,我们这个问题简化如下

假设地图为n*n的一个图,图中有且仅有一块X的联通快代表安全区域,有一个起点S代表缩圈的时候的起点,图中C代表的是车(保证车的数量小于等于100),标记为.的代表空地,可以任意通过,O代表障碍物不能通过。每次没有车的时候2s可以走一个格(只能走自己的上下左右4个方向),有车的话时间为1s走一个格

现在告诉你最多能坚持的时间为t秒,问你在t秒内(含t秒)能否从s点到达安全区域,能的话输出YES,并且输出最短时间,不能的话输出NO

输入描述

输入第一行一个整数T(1<=T<=10)
接下来有T组测试数据,每组测试数据输入2个数n和k(1<=n<=100,1<=k<=10^9)
接下来n行,每行n个字符,代表对应的n*n的地图,每个字符都是上面的一种,并且保证只有一个起点,只有一块安全区域。

输出描述

对于每组测试数据,先输出能否到达,能的话输出YES,然后换行输出最短时间,如果不能的话直接输出NO

示例1

输入:

3
2 3
.X
S.
2 3
.X
SC
2 4
.X
S.

输出:

NO
YES
3
YES
4

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++ 11.0.1) 解法, 执行用时: 14ms, 内存消耗: 516K, 提交时间: 2022-10-01 19:47:54

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e5+10;
int n,m;
int xs,ys;
char mp[107][107];

struct node{
	int x,y,step,c;
	bool operator < (const node &rhs) const {
		return step>rhs.step;
	}
};

int d[]={0,-1,0,1,0};
int bfs(){
	int book[2][107][107]={0};
    priority_queue<node> q;
	q.push({xs,ys,0,0});
	
	while(q.size()){
		node cur=q.top();
		q.pop();
		if(book[cur.c][cur.x][cur.y]) continue;
		book[cur.c][cur.x][cur.y]=1;
		if(mp[cur.x][cur.y]=='X')	return cur.step;
		
		for(int i=0;i<4;i++){
			int rx=cur.x+d[i];
			int ry=cur.y+d[i+1];
			int c=cur.c|(mp[rx][ry]=='C');
			if(rx<1||rx>n||ry<1||ry>n||mp[rx][ry]=='O'||book[c][rx][ry]) continue;
			q.push({rx,ry,cur.step+2-cur.c,c});
		}
		
	}
	return 1000000010;
}

int main(){
	int t;
	scanf("%d",&t);
	
	while(t--){
		scanf("%d%d",&n,&m);
		
		for(int i=1;i<=n;i++) scanf("%s",mp[i]+1);
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				if(mp[i][j]=='S') xs=i,ys=j;
			}
		}
		
		int ans=bfs();
		if(ans>m) printf("NO\n");
		else printf("YES\n%d\n",ans);
	}
}

C++(g++ 7.5.0)(g++7.5.0) 解法, 执行用时: 17ms, 内存消耗: 760K, 提交时间: 2023-07-30 17:39:39

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
char mp[1010][1010];
ll t,n,k,vis[105][105][3],x,y,xx,yy,p,ans=0;
ll dx[][2]={0,1,0,-1,1,0,-1,0};
struct stu{
	ll x,y,step,steep;
	bool operator<(const stu& a)const{
		return step > a.step;
	}
}a;
void BFS(){
	priority_queue<stu>q;
	while(!q.empty())q.pop();
	a.x=x;a.y=y;
	a.step=0;a.steep=2;
	vis[a.x][a.y][a.steep]=1;
	q.push(a);
	while(!q.empty()){
		a=q.top();q.pop();
		if(mp[a.x][a.y]=='X'&& a.steep <= k){
			cout<<"YES"<<endl<<a.step<<endl;return;
		}
		for(ll i=0;i<4;i++){
			xx=a.x+dx[i][0];yy=a.y+dx[i][1];
			p=a.steep;
			if(xx<1||yy<1||xx>n||yy>n||vis[xx][yy][p]||mp[xx][yy]=='O')continue;
			vis[xx][yy][p]=1;
			ans=a.step+p;
			if(mp[xx][yy]=='C')p=1;
			if(ans<=k)q.push({xx,yy,ans,p});
		}
	}
	cout<<"NO"<<endl;
}
int main(){
	cin>>t;
	while(t--){
		memset(vis,0,sizeof(vis));
		cin>>n>>k;
		for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)cin>>mp[i][j];
		for(int i=1;i<=n;i++)for(int j=1; j<=n;j++)if(mp[i][j]=='S')x=i,y=j;
		BFS();
	}
	return 0;
}

上一题