细品,你细品!!!
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int vis[1005][1005][15];///vis[x][y][k]:走到 (x, y),还有 k 步无敌状态。
char mp[1005][1005];
int dir[4][2]={1,0,-1,0,0,1,0,-1};
int n,k;
struct node
{
int x,y,k,step;
};
int bfs()
{
queue<node>q;
q.push({1,1,0,0});
while(!q.empty())
{
node nex=q.front();
q.pop();
if(nex.x==n&&nex.y==n)
{
return nex.step;
}
for(int i=0;i<4;i++)
{
int xx=nex.x+dir[i][0];
int yy=nex.y+dir[i][1];
if(xx<=n&&xx>=1&&yy<=n&&yy>=1&&mp[xx][yy]!='#')
{
if(mp[xx][yy]=='%'&&vis[xx][yy][k]==0)
{
mp[xx][yy]='.';
vis[xx][yy][k]=1;
q.push({xx,yy,k,nex.step+1});
}
if(mp[xx][yy]=='X'&&nex.k&&vis[xx][yy][nex.k-1]==0)
{
vis[xx][yy][nex.k-1]=1;
q.push({xx,yy,nex.k-1,nex.step+1});
}
if(mp[xx][yy]=='.'&&nex.k&&vis[xx][yy][nex.k-1]==0)
{
vis[xx][yy][nex.k-1]=1;
q.push({xx,yy,nex.k-1,nex.step+1});
}
if(mp[xx][yy]=='.'&&nex.k==0&&vis[xx][yy][0]==0)
{
vis[xx][yy][0]=1;
q.push({xx,yy,0,nex.step+1});
}
}
}
}
return -1;
}
int main()
{
while(cin>>n>>k)
{ios::sync_with_stdio(false);
memset(vis,0,sizeof(vis));
memset(mp,'\0',sizeof(mp));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>mp[i][j];
}
}
cout<<bfs()<<endl;
}
}