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; }