牛客 北京信息科技大学第十一届程序设计竞赛 D kotori和迷宫(bfs)
程序员文章站
2022-03-25 17:01:44
...
本来想着这不就是一个极其简单的dfs吗?搜到出口就+1,并且标记该出口和更新最小步数。直接开干,然后一直WA。仔细一想,dfs还真不行,因为搜到出口的时候不能保证是最小步数走到的。所以,改用bfs就好了。
PS:太菜了,这都快区域赛了,连个搜索都写半天,简直废物。。。
#include <bits/stdc++.h>
using namespace std;
const int N =35;
char mp[N][N];
bool vis[N][N];
int ans,step,n,m;
struct node
{
int x,y,s;
node(){}
node(int x,int y,int s):x(x),y(y),s(s){}
};
queue<node> q;
int nex[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int main(void)
{
int sx,sy,nx,ny;
node now;
ans=0;
step=100000;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%s",mp[i]+1);
for(int j=1;j<=m;j++)
if(mp[i][j]=='k')
sx=i,sy=j;
}
vis[sx][sy]=1;
q.push(node(sx,sy,0));
while(q.size())
{
now = q.front();
q.pop();
if(mp[now.x][now.y]=='e')
{
ans++;
step=min(step,now.s);
continue;
}
for(int i=0;i<4;i++)
{
nx=now.x+nex[i][0];
ny=now.y+nex[i][1];
if(nx<1||nx>n||ny<1||ny>m) continue;
if(vis[nx][ny]) continue;
if(mp[nx][ny]!='*')
{
vis[nx][ny]=1;
q.push(node(nx,ny,now.s+1));
}
}
}
if(!ans)
printf("-1\n");
else
printf("%d %d\n",ans,step);
return 0;
}
上一篇: BFS 入门(1)