题目链接:哆啦A梦传送门
刚看到这道题,一看是走迷宫类的题,看到就没兴趣,最不喜欢做的就是这些用bfs,dfs做的题,所以很显然比赛时我想都不想,想着不要这题也罢,赛后才知道这题是有多水,呕吐,从这次总结了一次教训,以后打比赛,不要挑题做,不然会很吃亏,还是好好敲遍bfs好了,当练手了,最不喜欢做的事都做好了,那还有什么做不好的。
题解:直接跑个bfs就好了,跑bfs时略微加个熔浆处理就行了。
代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cmath>
using namespace std;
const int maxn=1010;
int dix[]={-1,1,0,0};
int diy[]={0,0,-1,1};
int stx,sty,enx,eny,Fx,Fy;
int n,m;
struct node{
int x,y,step;
};
queue<node> que;
char op[maxn][maxn];
bool vis[maxn][maxn];
bool check(int tx,int ty,int sum) ///判断此点是否被熔浆覆盖了
{
if(abs(tx-Fx)+abs(ty-Fy)<=sum) return 1;
return 0;
}
bool bfs() ///这bfs没什么好讲的了,一看就懂
{
while(!que.empty()) que.pop();
que.push((node){stx,sty,0});
vis[stx][sty]=1;
while(!que.empty())
{
node item=que.front();
que.pop();
int vx=item.x,vy=item.y,sum=item.step;
int tx,ty;
for(int i=0;i<4;i++)
{
tx=vx+dix[i];
ty=vy+diy[i];
if(vis[tx][ty]) continue;
if(op[tx][ty]=='F'||op[tx][ty]=='#'||tx<0||tx>=n||ty<0||ty>=m||check(tx,ty,sum)) continue;
if(op[tx][ty]=='E') return 1;
//printf("tx=%d,ty=%d,sum=%d,i=%d\n",tx,ty,sum+1,i);
que.push((node){tx,ty,sum+1});
vis[tx][ty]=1;
}
}
return 0;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
for(int i=0;i<n;i++)
scanf("%s",op[i]);
// for(int i=0;i<n;i++){
// for(int j=0;j<m;j++)
// printf("%c",op[i][j]);
// puts("");
// }
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(op[i][j]=='F') Fx=i,Fy=j;
else if(op[i][j]=='S') stx=i,sty=j;
else if(op[i][j]=='E') enx=i,eny=j;
}
}
memset(vis,0,sizeof(vis)); ///标记初始化
if(bfs()) printf("PIG PIG PIG!\n");
else printf("A! WO SI LA!\n");
}
return 0;
}