2018年东北农业大学春季校赛 H why的吃鸡

链接: 点击打开链接

题目描述

最近吃鸡游戏非常火,你们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



解题 思路:开一个dis数组 表示从起点到当前这个点开车和不开车情况下的最小时间花费,如果当我到达一个点有最小值出现的时候,我就更新一下这个点,并加入到队列里,因为如果你一开始更新不是最小值的话,你就有可能同一个点入队多次,造成超时的结果,所以你得用优先队列。最后就是安全区不一定就一个点。

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
#include<iostream>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=110;
int n,m,t,dis[maxn][maxn][2],sx,sy,ex,ey;
char ch[maxn][maxn];
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
typedef struct Node{
	int x,y,flag,time;
	bool operator < (const Node &a) const{
		return time>a.time;
	}
}node;
bool check(int x,int y){
	if(x>=0&&x<n&&y>=0&&y<n)
		return 1;
	return 0;
}
int main(){
	int i,j;
	scanf("%d",&t);
	while(t--){
		scanf("%d%d",&n,&m);
		memset(dis,inf,sizeof(dis));
		for(i=0;i<n;i++){
			scanf("%s",ch[i]);
			for(j=0;j<n;j++){
				if(ch[i][j]=='S'){
					sx=i,sy=j;
				}
			}
		}
		dis[sx][sy][0]=0;
		priority_queue<node> qu;
		while(!qu.empty()) qu.pop();
		node no,po;
		no.x=sx;no.y=sy;no.flag=0;no.time=0;
		dis[no.x][no.y][0]=0;
		qu.push(no);
		while(!qu.empty()){
			no=qu.top();qu.pop();
			if(no.time>m) continue;
			for(i=0;i<4;i++){
				int xx=dx[i]+no.x;
				int yy=dy[i]+no.y;
				if(check(xx,yy)&&ch[xx][yy]!='O'){
					if(ch[xx][yy]=='C'){
						po.flag=1;
					}
					else
						po.flag=no.flag;
					if(no.flag) po.time=no.time+1;
					else po.time=no.time+2;
					if(po.time<dis[xx][yy][po.flag]){
						dis[xx][yy][po.flag]=po.time;
						po.x=xx;po.y=yy;
						qu.push(po);
					}
				}
			}
		}
		int ans=inf;
		for(i=0;i<n;i++){
			for(j=0;j<n;j++){
				if(ch[i][j]=='X'){
					ans = min(ans,min(dis[i][j][0], dis[i][j][1]));
				}
			}
		}
		if(ans>m){
			printf("NO\n");
		}
		else{
			printf("YES\n");
			printf("%d\n",ans);
		}
	}
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/bao___zi/article/details/79830446
今日推荐