NYOJ 迷宫寻宝(一)

# include<iostream>
# include<string>
# include<string.h>
# include<queue>
# include<stdio.h>
# include<math.h>
#include <algorithm>
using namespace std;
char d[30][30];
int a[5],b[5];
struct Node
{
    int x,y;
    int num;
}node,temp,f[4];
queue<Node> q,q1;
void bfs(int x,int y,int m,int n)
{
    int k;
    node.x = x;
    node.y = y;
    q.push(node);
    d[x][y] = ‘0‘;
    while(!q.empty())
    {
        temp = q.front();
        q.pop();
        for(int i=0;i<4;i++)
        {
            int t1,t2;
            t1 = temp.x + f[i].x;
            t2 = temp.y + f[i].y;
            if(t1<0 ||t1>=m || t2<0 || t2>=n)
                continue;
            if(d[t1][t2] == ‘G‘)
            {
                printf("YES\n");
                return;
            }
            else if(d[t1][t2] == ‘0‘ || d[t1][t2] == ‘X‘)
            {
                continue;
            }
            else if(d[t1][t2] == ‘A‘ || d[t1][t2] == ‘B‘ || d[t1][t2] == ‘C‘ || d[t1][t2] == ‘D‘ || d[t1][t2] == ‘E‘)
            {
                k = d[t1][t2] - ‘A‘;
                if(b[k]>=a[k] && a[k]!=0)
                {
                    d[t1][t2] = ‘0‘;
                    node.x = t1;
                    node.y = t2;
                    q.push(node);
                }
                else
                {
                    node.x = t1;
                    node.y = t2;
                    node.num = k;
                    q1.push(node);
                }
            }
            else if(d[t1][t2] == ‘.‘ || d[t1][t2] == ‘a‘ || d[t1][t2] == ‘b‘ || d[t1][t2] == ‘c‘ || d[t1][t2] == ‘d‘ || d[t1][t2] == ‘e‘)
            {

                if(d[t1][t2]!=‘.‘)
                {
                    k = d[t1][t2] - ‘a‘;
                    b[k]++;
                }
                d[t1][t2] = ‘0‘;
                node.x = t1;
                node.y = t2;
                q.push(node);
            }

        }

        if(q.empty()==true && q1.empty()!=true)
        {
            k = q1.size();
            for(int i=0;i<k;i++)
            {
                temp = q1.front();
                q1.pop();
                if(b[temp.num]>=a[temp.num] && a[temp.num]!=0)
                {
                    q.push(temp);
                    d[temp.x][temp.y] = ‘0‘;
                }
                else
                {
                    q1.push(temp);
                }
            }
        }

    }
    //要清空q1
    while(!q1.empty())
    {
        q1.pop();
    }
    printf("NO\n");
}
int main()
{
      int n,m,i,j,x,y;
      f[0].x=0;f[0].y=1;
      f[1].x=0;f[1].y=-1;
      f[2].x=1;f[2].y=0;
      f[3].x=-1;f[3].y=0;
      scanf("%d %d",&m,&n);
      getchar();
      while(n!=0 || m!=0)
      {
          for(i=0;i<5;i++)
        {
            a[i] = 0;
            b[i] = 0;
        }

        //要重置d数组
        for(i=0;i<30;i++)
            for(j=0;j<30;j++)
                d[i][j]=‘0‘;
          for(i=0;i<m;i++)
          {
              for(j=0;j<n;j++)
            {
                scanf("%c",&d[i][j]);
                if(d[i][j]==‘S‘)
                {
                    x = i;
                    y = j;
                }
                if(d[i][j]==‘a‘)        a[0]++;
                else if(d[i][j]==‘b‘)    a[1]++;
                else if(d[i][j]==‘c‘)    a[2]++;
                else if(d[i][j]==‘d‘)    a[3]++;
                else if(d[i][j]==‘e‘)    a[4]++;
            }
            getchar();
        }

        bfs(x,y,m,n);

        /*
        for(i=0;i<m;i++)
          {
              for(j=0;j<n;j++)
            {
                printf("%c",d[i][j]);
            }
            printf("\n");
        }
        */
        scanf("%d %d",&m,&n);

        //WA原因 少了这句话
        getchar();
    }
    return 0;
} 

原文地址:https://www.cnblogs.com/fzuhyj/p/9486379.html

时间: 2024-10-19 20:58:14

NYOJ 迷宫寻宝(一)的相关文章

NYOJ 迷宫寻宝(一)深搜

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=82 做这道题的时候迷迷糊糊的,,果然比较难..最后也是没有做出来..请教了一下学长,学长说我基础还不好..基础果然重要,这道题是一道搜索题,我没有考虑钥匙在门后面的情况,比如aBbSAG 多亏学长指教,通过这道题对深搜的理解又加深了一步~ #include <iostream> #include <cstdio> #include <cstring> using

NYOJ迷宫寻宝(一)【BFS】

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

nyoj迷宫寻宝(一)

1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <queue> 6 7 using namespace std; 8 struct node{ 9 int x,y; 10 }; 11 queue<node> q; 12 char maze[25][25]; //地图 13 int key[5

nyoj 82迷宫寻宝(一)

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

nyoj 82 迷宫寻宝(一)

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

nyoj 82 迷宫寻宝(一) 【BFS】

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

迷宫寻宝(一)

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

ny82 迷宫寻宝(一) map+queue

题目地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=82 AC代码:讲解,先统计在可搜索范围内对应的钥匙数,把搜到的门存到另外的一个队列中,第一个搜索结束后,开始看搜到的钥匙能否打看门, 如果能打看门,存到第一个队列中,在进行搜寻,知道找到宝藏,或者什么也没有找到,则退出: AC代码: 1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #

迷宫寻宝(一) BFS

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