题目
解释
- 纯纯使用bfs来判断
- 与一般bfs不同的是,增加了时间维度
- 当时间小于2*k时
- 我们首先进行两种选择
- 一个是原地等待,一个是前进
- 当时间大于2*k时
- 只管前进即可
- 一个细节点在于
- 体型的变化在胖子移动后才发生
- 因此check判断时,胖子的体型还是移动前的体型,即t.time
#include<bits/stdc++.h>
using namespace std;
const int N=330;
char g[N][N];
bool st[N][N];
int n,k;
struct state
{
int x;
int y;
int time;
};
bool check(int x,int y,int nowtime)
{
int m=0;
if(nowtime<k)m=2;
else if(nowtime >=2*k)m=0;
else m=1;
if(st[x][y])return false;
for(int i=x-m;i<=x+m;i++)
{
for(int j=y-m;j<=y+m;j++)
if(g[i][j]!='+')return false;
}
return true;
}
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
int bfs()
{
queue<state>q;
q.push({3,3,0});
st[3][3]=true;
while(q.size())
{
auto 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],yy=t.y+dy[i];
if(!check(xx,yy,t.time))continue;
q.push({xx,yy,t.time+1});
st[xx][yy]=true;
if(xx==n-2&&yy==n-2)return t.time+1;
}
}
}
int main()
{
cin >> n >> k;
for (int i = 1; i <= n; i++)
for(int j=1;j<=n;j++)
cin >> g[i][j];
cout << bfs() << endl;
}
|