链接:
点击打开链接
题目描述
最近吃鸡游戏非常火,你们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;
}