zoukankan      html  css  js  c++  java
  • 广搜:codevs-3344(初步bfs)

                    一道典型的迷宫问题

    小刚在迷宫内,他需要从A点出发,按顺序经过B,C,D……,到达最后一个点,再回到A点。迷宫内有些障碍,问至少走几步。

    输入描述 Input Description

    第一行有三个数n,m表示迷宫有n行,m列。

    第2行到第n+1行,每行m个字符,可能是’A’..’Z’,’2’,’0’ 其中,2表示障碍,0表示可以走。’A’..’Z’也可以走。

    输出描述 Output Description

    至少走几步可以按规定走完,如果不行,输出“Impossible”

    读完题后发现这道题比较吸引人的一点是在同一组数据中需要进行多次bfs,很有趣。

    比较坑的地方在于,每一次需要判断是否能到达下一点,如果其中一个点到不了,那么便mission fail~

    那么没什么问题啦,贴代码:

    (写这道题的时候有点着急,以至于变量使用的有点乱QAQ)

    #include<bits/stdc++.h>
    using namespace std;
    int ans,pre[100100],xz,yz,head,tail,n,m,flag;
    int u[10]={1,-1,0,0},p[10]={0,0,1,-1};
    int a[8848],b[8848],x[30],y[30];
    bool map1[510][510],map2[510][510];
    void pro(int num){
        while(pre[num]){
            ++ans;
            num=pre[num];
        }
        return ;
    }
    void doit(){
        int i;
        do{
            head++;
            for( i = 0 ; i < 4 ; ++i){
                int xk=u[i]+a[head];
                int yk=p[i]+b[head];
                if(xk>=1&&xk<=n&&yk>=1&&yk<=m&&map2[xk][yk]){
                    tail++;
                    a[tail]=xk;b[tail]=yk;pre[tail]=head;
                    map2[xk][yk]=false;
                    if(xk==xz&&yk==yz){
                        flag=1;
                        pro(tail);head=tail;
                        break;
                    }
                }
            }
        }while(head<tail);
    }
    void start(){
        int i,j;
        flag=0;
        head=0;tail=1;
        memset(pre,0,sizeof(pre));
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        memset(map2,true,sizeof(map2));
        for(i = 1 ; i <= n ; ++i)
            for(j = 1 ; j <= m ; ++j)
                map2[i][j]=map1[i][j];
            
    }
    int main(){
        int j,sum=0;
        char s[100];
        memset(map1,true,sizeof(map1));
        scanf("%d%d",&n,&m);
        for(int i = 1 ; i <= n ; ++i){
            scanf("%s",s);
            for( j = 1 ; j <= m ; ++j){
                if(s[j-1]=='2')map1[i][j]=false;
                if(s[j-1]>=65){
                    x[s[j-1]-64]=i;
                    y[s[j-1]-64]=j;
                    sum++;
                }
            }
        }
        for(int i = 1 ; i < sum ; ++i){
            start();
            xz=x[i+1];yz=y[i+1];
            a[tail]=x[i];b[tail]=y[i];pre[tail]=0;
            map2[x[i]][y[i]]=false;
            doit();
            if(!flag){
                printf("Impossible
    ");
                return 0;
            }
        }    
        start();
        xz=x[1];yz=y[1];
        a[tail]=x[sum];b[tail]=y[sum];pre[tail]=0;
        map2[x[sum]][y[sum]]=false;
        doit();
        if(!flag){
                printf("Impossible
    ");
                return 0;
            }
        printf("%d
    ",ans);
        return 0;
    }
  • 相关阅读:
    强迫症
    bzoj1758 [Wc2010]重建计划
    bzoj1070 [SCOI2007]修车
    bzoj3675 [Apio2014]序列分割
    bzoj1010 [HNOI2008]玩具装箱toy
    bzoj3697 采药人的路径
    bzoj2152 聪聪可可
    bzoj2599 [IOI2011]Race
    Ubuntu 18.04 LTS 下 GTK3 安装与编译
    启动或重启 dnsmasq 提示端口 53 被占用的解决方案
  • 原文地址:https://www.cnblogs.com/fujudge/p/6879378.html
Copyright © 2011-2022 走看看