AcWing 2548. 大胖子走迷宫
原题链接
简单
作者:
术
,
2021-04-06 14:32:35
,
所有人可见
,
阅读 456
#include <iostream>
#include <queue>
using namespace std;
const int N=305;
int n,k;
char g[N][N];
bool st[N][N];
int dx[4]= {0,1,0,-1};
int dy[4]= {1,0,-1,0};
int d[3]= {2,1,0};
struct Edge
{
int x;
int y;
int time;
Edge(int x,int y,int time)
{
this->x=x;
this->y=y;
this->time=time;
}
};
//三维 bfs
int bfs()
{
queue<Edge> q;
//Edge e=Edge(3,3,0);
q.push(Edge(3,3,0));
st[3][3]=true;
while(!q.empty())
{
//将原点加入队列,即静止不动
Edge t=q.front();
q.pop();
if(t.time/k<2)
q.push(Edge(t.x,t.y,t.time+1));
for(int i=0; i<4; i++)
{
int a=t.x+dx[i];
int b=t.y+dy[i];
int fat=t.time/k>=2?0:d[t.time/k];//有多胖
if(a-fat<=0||a+fat>n||b-fat<=0||b+fat>n)
continue;//弱国超出迷宫界限
if(st[a][b])
continue;
//判断所占区域是否有障碍物
bool flag=false;
for(int u=a-fat; u<=a+fat; u++)
{
for(int v=b-fat; v<=b+fat; v++)
{
if(g[u][v]=='*')
flag=true;
}
}
if(flag)
continue;
if(a==n-2&&b==n-2)
return t.time+1;
st[a][b]=true;
//加入队列
q.push(Edge(a,b,t.time+1));
}
}
}
int main()
{
cin>>n>>k;
for(int i=0; i<n; i++)
{
string s;
cin>>s;
for(int j=0; j<s.size(); j++)
{
g[i+1][j+1]=s[j];
}
}
cout<<bfs();
return 0;
}