无处打卡就在这里写个题解吧(做完感觉国赛无了)
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
int n,k;
char mp[305][305];
bool hp[305][305];
struct aa{
int x,y;
int time;
};
int check(int x, int y, int ntime) { //判断是否合法
int h=0; //小明的“宽度”
if(ntime<k)
h=2;
else if(ntime>=k&&ntime<2*k)
h=1;
if(x-h<1||x+h>n||y-h<1||y+h>n) //是否越界
return 0;
if(hp[x][y])
return 0;
for(int i=x-h;i<=x+h;i++) //”体内”是否有障碍物
for(int j=y-h;j<=y+h;j++)
if(mp[i][j]=='*')
return 0;
return 1;
}
int bfs(){ //bfs常规模板
queue<aa> q;
q.push({3,3,0});
hp[3][3]=1;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
while(q.size()){
aa t=q.front();
q.pop();
if(t.time<2*k) //没到正常人时 站着不动是必可行的一种方案
q.push({t.x,t.y,t.time+1});
for(int i=0;i<4;i++){
int xx=t.x+dx[i];
int yy=t.y+dy[i];
if(!check(xx,yy,t.time))
continue;
q.push({xx,yy,t.time+1});
hp[xx][yy]=1;
if(xx==n-2&&yy==n-2) //答案
return t.time+1;
}
}
}
int main(){
cin>>n>>k;
getchar() ;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
mp[i][j]=getchar();
getchar();
}
cout<<bfs();
return 0;
}
为啥 没到正常人时 站着不动是必可行的一种方案
if(t.time<2*k) //没到正常人时 站着不动是必可行的一种方案
q.push({t.x,t.y,t.time+1}); 这一句
样例你可以参考下
请教下大佬为什么if(!check(xx,yy,t.time)) 这一步里面time不加1呢,毕竟x,y已经加了一步了???
time+1表示的是到达xx,yy的时间,但是能不能走去xx,yy应该在time进行判断
牛逼
谢谢
大佬强啊