• hdu 2102 A计划 bsf搜索


    http://acm.hdu.edu.cn/showproblem.php?pid=2102

    本题又是一道BSF搜索求最短路,只是在遇到‘#’时空传输时要注意一下,如果‘#’所对应的另一个迷宫位置也是‘#’时是没有意思的。

    #include <iostream>
    #include <stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include <queue>
    #include <algorithm>
    using namespace std;
    char map[25][15];
    int T,co,ro;
    int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}},visited[25][15];
    struct coor
    {
        int x,y;
        int step;
    };
    queue<coor>que;
    bool judge(int x,int y,int flag)
    {
        if(x<0||y<0||y>=ro)
        return false;
        if(flag<co)
        {
            if(x>=co)
            return false;
        }
        else
        {
            if(x>=2*co||x<co)
            return false;
        }
        if(visited[x][y]||map[x][y]=='*')
        return false;
        return true;
    }
    bool bfs()
    {
        int i,x,y;
        coor in,out;
        memset(visited,0,sizeof(visited));
        while(!que.empty())
        que.pop();
        in.x=0;
        in.y=0;
        in.step=0;
        que.push(in);
        while(!que.empty())
        {
            out=que.front();
            que.pop();
            if(out.step>T)
            return false;
            if(map[out.x][out.y]=='P')
            {
                printf("YES\n");
                return true;
            }
            for(i=0;i<4;i++)
            {
                x=out.x+dir[i][0];
                y=out.y+dir[i][1];
                if(!judge(x,y,out.x))
                continue;
                visited[x][y]=1;
                in.x=x;
                in.y=y;
                if(map[x][y]=='#')
                {
                    if(x<co)
                    in.x=x+co;
                    else
                    in.x=x-co;
                    visited[x][y]=1;
                }
                in.step=out.step+1;
                que.push(in);
            }
        }
        return false;
    }
    int main()
    {
        int cas,i,j;
        scanf("%d",&cas);
        while(cas--)
        {
            scanf("%d%d%d",&co,&ro,&T);
            for(i=0;i<2*co;i++)
            scanf("%s",map[i]);
            for(i=0;i<co;i++)
            for(j=0;j<ro;j++)
            {
                if((map[i][j]=='#'&&map[i+co][j]=='#')||(map[i][j]=='#'&&map[i+co][j]=='*')||(map[i][j]=='*'&&map[i+co][j]=='#'))
                {
                    map[i][j]='*';
                    map[i+co][j]='*';
                }
            }
            if(!bfs())
            printf("NO\n");
        }
        return 0;
    }
                       
                       

  • 相关阅读:
    Linux使用locate命令定位文件
    LINUX常用命令
    linux性能问题(CPU,内存,磁盘I/O,网络)
    Linux下常用的shell命令记录
    Linux下的进程管理
    Linux常用性能检测命令解释
    CentOS查看系统信息-CentOS查看命令
    linux系统中如何查看日志 (常用命令)
    美团HD(4)-二级联动效果
    美团HD(3)-加载分类导航数据
  • 原文地址:https://www.cnblogs.com/zxj015/p/2740249.html
Copyright © 2020-2023  润新知