#include<stdio.h>
#include<queue>
#include<math.h>
#include<iostream>
using namespace std;
struct map{
char what;
int x,y;
int power;
int sum;
};
map ma[1005][1005],t;
queue <map> q;
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
int n,k;
int main(){
cin >> n >> k;
for(int i = 0;i < n;i++)
for(int j = 0;j < n;j++){
cin >> ma[i][j].what;
if(ma[i][j].what=='X') ma[i][j].power=0;
else ma[i][j].power=-1;
ma[i][j].x=i;
ma[i][j].y=j;
ma[i][j].sum=0;
}
// char ch;
// scanf("%d%d",&n,&k);
// for(int i = 0; i < n; i++){
// for(int j = 0; j < n; j++){
// scanf("%1c",&ch);
// if(ch=='\n') scanf("%1c",&ch);
// ma[i][j].what=ch;
// ma[i][j].x=i;
// ma[i][j].y=j;
// if(ma[i][j].what=='X') ma[i][j].power=0;
// else ma[i][j].power=-1;
// ma[i][j].sum=0;
// }
// }
ma[0][0].power=0;
q.push(ma[0][0]);
while(!q.empty()){
t = q.front();
q.pop();
if(t.x==n-1&&t.y==n-1){
printf("%d",t.sum);
return 0;
}
for(int i = 0; i < 4; i++){
int nx = t.x + dx[i],ny = t.y + dy[i];
if(nx >= 0 && nx < n && ny >= 0 && ny < n){
if((ma[nx][ny].what == '.' || ma[nx][ny].what == 'X') && ma[t.x][t.y].power > ma[nx][ny].power){
ma[nx][ny].power = max(0,ma[t.x][t.y].power - 1);
ma[nx][ny].sum = t.sum + 1;
q.push(ma[nx][ny]);
}else if(ma[nx][ny].what == '%' && ma[t.x][t.y].power > ma[nx][ny].power){
ma[nx][ny].power = k;
ma[nx][ny].sum = t.sum + 1;
q.push(ma[nx][ny]);
}
}
}
}
printf("-1");
return 0;
}
慎用scanf() 如果你也像我一样用scanf()在本地和洛谷ide上正常运行一提交就满江红,那真是……太酷(shabi)啦!