哈理工第八届程序设计竞赛同步赛(高年级) G-小乐乐打游戏 (bfs,挑题的后果)

版权声明:转载注明下出处就行了。 https://blog.csdn.net/LJD201724114126/article/details/84679435

题目链接:哆啦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;

}

猜你喜欢

转载自blog.csdn.net/LJD201724114126/article/details/84679435
今日推荐