思路:分无敌时和非无敌时搜索,但代码成功的挂了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
*/