• 广搜: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;
    }
  • 相关阅读:
    itoa
    sprintf用法 [转载]
    atoi 与 itoa的实现
    数组排序总结(冒泡,选择,插入,希尔)
    XML入门精解之文件格式定义(DTD)
    malloc()函数的工作机制 结构体的总结
    字符串指针与字符数组(ZT)
    sprintf函数你了解有多深!
    sprintf
    sql ldr 笔记
  • 原文地址:https://www.cnblogs.com/fujudge/p/6879378.html
Copyright © 2020-2023  润新知