30分求助
查看原帖
30分求助
379113
dtrthg楼主2023/4/5 12:43

思路:分无敌时和非无敌时搜索,但代码成功的挂了qwq

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define of(i,a,b) for(int i=b;i>=a;i--)
const int Mod=1e9+7;
const int mod=1e6+7;
const int INF=0x3f3f3f3f;
const int M=11,N=45;
const int Maxn=1010;
const int dx[]={1,0,-1,0};
const int dy[]={0,1,0,-1};
char data[Maxn][Maxn];
bool vis[Maxn][Maxn];
int n,k;
struct node
{
 int x,y,cnt,wd;
};
void bfs()
{
 queue <node> q;
 vis[1][1]=1;
 q.push({1,1,0,0});
 while(!q.empty())
 {
  node now=q.front(); q.pop();
//  cout<<now.x<<' '<<now.y<<endl;//
  if(now.x==n&&now.y==n)
  {
   cout<<now.cnt<<endl;
   exit(0);
  }
  fo(i,0,3)
  {
   int nx=now.x+dx[i],ny=now.y+dy[i];
   if(nx>n||nx<1||ny>n||ny<1) continue;
   if(data[nx][ny]=='#') continue;
   if(!now.wd)
   {
    if(data[nx][ny]=='X') continue;
    if(!vis[nx][ny])
    {
     vis[nx][ny]=1;
     if(data[nx][ny]=='%') now.wd+=k;
     q.push({nx,ny,now.cnt+1,now.wd});
    }
   }
   else
   {
    vis[nx][ny]=1;
    if(data[nx][ny]=='%'&&!vis[nx][ny]) now.wd+=k;
    q.push({nx,ny,now.cnt+1,now.wd-1});
   }
  }
 }
}
int main()
{
  cin>>n>>k;
  fo(i,1,n)
  {
   fo(j,1,n) cin>>data[i][j];
 }
 bfs();
  return 0;
}
/*
in1:
5 3
...XX
##%#.
...#.
.###.
.....
out1;
10
*/
2023/4/5 12:43
加载中...