bfs搜索
每个时间段胖子的体型不同 , 分为三种 ,所以我们要分三种判别的方式
因为样例保证能找到出路,所以在胖子很胖的时候被可能被恰住,但是变成1的时候一定不会被卡住,所以我们直接把体积t!=1的时候胖子的位置再加入队列中,但是时间加1 ,这样的话就可以实现胖子原地呆1步;
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std ;
const int N = 310 ;
char mp[N][N] ;
int d[4][2] = {{0,1},{0,-1},{1,0},{-1,0}} ;
int n , k ,t;
bool v[N][N] ;
struct node{
int x, y ,dis ;
node(int xx, int yy , int diss){
x = xx , y = yy , dis = diss ;
}
};
queue<node> q;
bool check_5(int x,int y){
if(v[x][y]) return false ;
for(int i = x-2; i <= x +2 ; i ++){
for(int j = y-2; j <= y +2 ; j ++){
if(i < 0 || i >= n|| j < 0|| j >= n ) return false ;
if(mp[i][j] == '*') return false ;
}
}
return true ;
}
bool check_3(int x,int y){
if(v[x][y]) return false ;
for(int i = x-1; i <= x +1 ; i ++){
for(int j = y-1; j <= y +1 ; j ++){
if(i < 0 || i >= n|| j < 0|| j >= n ) return false ;
if( mp[i][j] == '*') return false ;
}
}
return true ;
}
bool check_1(int x,int y){
if(v[x][y]) return false ;
if(x < 0 || x >= n|| y < 0|| y >= n ) return false ;
if( mp[x][y] == '*') return false ;
return true ;
}
void bfs(){
q.push(node(2,2,0)) ;
while(!q.empty()){
node now = q.front() ;
q.pop() ;
int x = now.x , y = now.y ;
if(x == n-3 && y == n-3) {
cout << now.dis << endl ; return ;
}
if(now.dis < k) t = 5 ;
else if(now.dis >= k&& now.dis < 2*k) t = 3 ;
else if(now.dis >= 2*k) t = 1;
if(t!=1) q.push(node(x,y,now.dis+1)) ;
for(int i = 0 ; i < 4 ; i ++){
int tx = x +d[i][0], ty = y + d[i][1] ;
if(t==5){
if(check_5(tx,ty) ) {
v[tx][ty] = 1 ;
q.push(node(tx,ty,now.dis+1)) ;
}
}
else if(t==3) {
if(check_3(tx,ty)){
v[tx][ty] = 1 ;
q.push(node(tx,ty,now.dis+1)) ;
}
}
else if(t == 1){
if(check_1(tx,ty)){
v[tx][ty] = 1 ;
q.push(node(tx,ty,now.dis+1)) ;
}
}
}
}
}
int main(){
cin >> n >> k ;
for(int i = 0; i < n ; i ++) cin >> mp[i] ;
v[2][2] = 1 ;
bfs();
return 0 ;
}