• 南阳oj 82 迷宫寻宝(一)


    迷宫寻宝(一)

    描述
    一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫里有N个编过号的门(N<=5),它们分别被编号为A,B,C,D,E.为了找到宝藏,ACM必须打开门,但是,开门之前必须在迷宫里找到这个打开这个门所需的所有钥匙(每个门都至少有一把钥匙),例如:现在A门有三把钥匙,ACM就必须找全三把钥匙才能打开A门。现在请你编写一个程序来告诉ACM,他能不能顺利的得到宝藏。

    输入
    输入可能会有多组测试数据(不超过10组)。
    每组测试数据的第一行包含了两个整数M,N(1<N,M<20),分别代表了迷宫的行和列。接下来的M每行有N个字符,描述了迷宫的布局。其中每个字符的含义如下:
    .表示可以走的路
    S:表示ACM的出发点
    G表示宝藏的位置
    X表示这里有墙,ACM无法进入或者穿过。
    A,B,C,D,E表示这里是门,a,b,c,d,e表示对应大写字母的门上的钥匙。
    注意ACM只能在迷宫里向上下左右四个方向移动。

    最后,输入0 0表示输入结束。
    输出
    每行输出一个YES表示ACM能找到宝藏,输出NO表示ACM找不到宝藏。
    样例输入
    4 4
    S.X.
    a.X.
    ..XG
    ….
    3 4
    S.Xa
    .aXB
    b.AG
    0 0
    样例输出
    YES
    NO

    被坑了 原来是一遍一遍的遍历修改 ┭┮﹏┭┮
    多次查找
    更开始想这根据他的ABCDE的个数计算遍历次数结果 错了漏洞很多
    还是 多次遍历 分别统计修改ABCDE为“.”也就是找到一个门的所有钥匙打开门 方便前行
    没有找到宝藏时,在一次遍历时,没有找到任何一枚钥匙,就不用在遍历了,可以直接结束。因为在一次遍历中在它所能走的路上没有钥匙且没有找到宝藏,那么就没有可能能找到宝藏了。

    #include<iostream>
    #include<algorithm>
    #include<queue>
    #include<cstring>
    #include<cstdio>
    using namespace std;
    struct node
    {
        int x,y;
    }as,x1,t;
    int n,m,k;
    int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
    int a1[21][21];
    char a[22][22];
    int a2,a3,b2,b3,c2,c3,d2,d3,e2,e3;
    int a4,b4,c4,d4,e4;
    int dfs()
    {
        k=0;
        a1[x1.x][x1.y]=1;
        queue<node>q;
        q.push(x1);
        while(!q.empty())
        {
            as=q.front();
            q.pop();
            for(int i=0;i<4;i++)
            {
                t.x=as.x+dir[i][0];
                t.y=as.y+dir[i][1];
                if(a[t.x][t.y]=='G')
                {
                    return 1;
                }
                if(t.x>=0&&t.x<n&&t.y>=0&&t.y<m&&a[t.x][t.y]!='X'&&a1[t.x][t.y]==0)
               {
                    a1[t.x][t.y]=1;
                    if(a[t.x][t.y]=='a')
                    {
                        a4++; a[t.x][t.y]='.'; k=1;
                    }
                    if(a[t.x][t.y]=='b')
                    {
                        b4++; a[t.x][t.y]='.'; k=1;
                   }
                  if(a[t.x][t.y]=='c')
                    {
                        c4++; a[t.x][t.y]='.';k=1;
                    }
                    if(a[t.x][t.y]=='d')
                    {
                        d4++; a[t.x][t.y]='.';k=1;
                    }
                    if(a[t.x][t.y]=='e')
                    {
                        e4++; a[t.x][t.y]='.';k=1;
                    }
                    if(a[t.x][t.y]=='A'&&a4!=a2)
                        continue;
                    if(a[t.x][t.y]=='B'&&b4!=b2)
                        continue;
                    if(a[t.x][t.y]=='C'&&c4!=c2)
                        continue;
                    if(a[t.x][t.y]=='D'&&d4!=d2)
                        continue;
                    if(a[t.x][t.y]=='E'&&e4!=e2)
                        continue;
                    q.push(t);
                }
            }
        }
        if(k==1)
            return 0;
        else
            return -1;
    }
    int main()
    {
       while(~scanf("%d %d",&n,&m))
        {
            if(n==0&&m==0)
                break;
            memset(a,0,sizeof(a));
            a2=0; a3=0; b2=0; b3=0; c2=0; c3=0; d2=0; d3=0; e2=0; e3=0;
            for(int i=0;i<n;i++)
            {
                getchar();
                for(int j=0;j<m;j++)
                {
                    scanf("%c",&a[i][j]);
                    if(a[i][j]=='S')
                    {
                        x1.x=i;
                        x1.y=j;
                    }
                    if(a[i][j]=='a')
                        a2++;
                    if(a[i][j]=='b')
                        b2++;
                    if(a[i][j]=='c')
                        c2++;
                    if(a[i][j]=='d')
                       d2++;
                    if(a[i][j]=='e')
                        e2++;
                }
            }
            a4=0; b4=0; c4=0; d4=0; e4=0;
           while(1)
           {
               memset(a1,0,sizeof(a1));
                int t=dfs();
                if(t==0)
                    continue;
                else if(t==-1)
                {
                    printf("NO
    "); break;
                }
                else
                {
                    printf("YES
    "); break;
                }
           }
        }
        return 0;
    }
    
    
  • 相关阅读:
    C# 微信 生活助手 空气质量 天气预报等 效果展示 数据抓取 (二)
    2014年个人总结
    是去是留?这是个问题
    电信限制ip的解决方案
    机械学习
    mac-mysql
    如何使用代码生成工具
    如何使用自定义表单和自定义流程
    test
    编程小问题001
  • 原文地址:https://www.cnblogs.com/nanfenggu/p/7900173.html
Copyright © 2020-2023  润新知