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];//记录钥匙个数;
 14 node door[5];//门的位置;
 15 node D;//起始位置
 16
 17 void add(int i,int j)  //第四个方向遍历
 18 {
 19     D.x=i+1;
 20     D.y=j;
 21     if(‘X‘!=maze[D.x][D.y])
 22         q.push(D);
 23     D.x=i-1;
 24     D.y=j;
 25     if(‘X‘!=maze[D.x][D.y])
 26         q.push(D);
 27     D.x=i;
 28     D.y=j+1;
 29     if(‘X‘!=maze[D.x][D.y])
 30         q.push(D);
 31     D.x=i;
 32     D.y=j-1;
 33     if(‘X‘!=maze[D.x][D.y])
 34         q.push(D);
 35 }
 36
 37 int BFS()
 38 {
 39     int i,j;
 40     memset(door,0,sizeof(door));
 41     while(!q.empty())
 42     {
 43         D=q.front();
 44         q.pop();
 45         i=D.x;  j=D.y;                 //记录当前位置
 46         if(‘a‘==maze[i][j]||‘b‘==maze[i][j]||‘c‘==maze[i][j]||‘d‘==maze[i][j]||‘e‘==maze[i][j])//如果为钥匙则-1;
 47         {
 48             key[maze[i][j]-‘a‘]--;
 49             if(key[maze[i][j]-‘a‘]==0&&door[maze[i][j]-‘a‘].x!=0&&door[maze[i][j]-‘a‘].y!=0)//如果之前访问过此屋,并且钥匙以全找到 则加入队列
 50                 q.push(door[maze[i][j]-‘a‘]);
 51             maze[i][j]=‘X‘;
 52             add(i,j);
 53         }
 54         else
 55         {
 56             if((‘E‘==maze[i][j]||‘B‘==maze[i][j]||‘C‘==maze[i][j]||‘D‘==maze[i][j]||‘A‘==maze[i][j])&&0!=key[maze[i][j]-‘A‘])   //为房屋并且此房屋钥匙没全找到,记录此位置。
 57                 door[maze[i][j]-‘A‘]=D;
 58             else
 59                 if(‘G‘==maze[i][j])    //找到返回
 60                 return 1;
 61             else
 62                 if(‘X‘!=maze[i][j])//可以走的位置。
 63             {
 64                 maze[i][j]=‘X‘;
 65                 add(i,j);
 66             }
 67         }
 68     }
 69     return 0;
 70 }
 71
 72
 73 int main()
 74 {
 75     int m,n,i,j;
 76     while(scanf("%d%d",&m,&n)&&(m!=0||n!=0))
 77     {
 78         memset(maze,‘X‘,sizeof(maze));
 79         memset(key,0,sizeof(key));
 80         for(i=1;i<=m;i++)
 81         {
 82             scanf("%s",&maze[i][1]);
 83             for(j=1;j<=n;j++)
 84             {
 85                 if(maze[i][j]==‘a‘||maze[i][j]==‘b‘||maze[i][j]==‘c‘||maze[i][j]==‘d‘||maze[i][j]==‘e‘)
 86                     key[maze[i][j]-‘a‘]++;
 87                     else{
 88                             if(‘S‘==maze[i][j])
 89                             {
 90                                 D.x=i;  D.y=j;  q.push(D);
 91                             }
 92                     }
 93             }
 94         }
 95         if(BFS())
 96                 printf("YES\n");
 97             else
 98                 printf("NO\n");
 99     }
100     return 0;
101 }
102
103                 

解题思路:

记录某种钥匙总数(即剩余未访问到的钥匙数),记录开始位置并入队,利用广搜,从开始位置进行搜索,进行逐个出队判断:

1:如果找到某把钥匙,则剩余这种钥匙数减1,并进行判断:这种钥匙是否已找到完,这种钥匙所对应的门是否以找到,如果两个条件都满足,则把该门入队。然后把钥匙位置标记已遍历,对其相邻点进行广搜;

2:如果找到某个门并且其钥匙没有找到全部,则标记记录门的位置;

3:如果找到宝藏,则返回1,表示成功找到宝藏;

4:如果为开始位置‘S‘、可走位置‘.‘、已找到全部钥匙的门,则将其标记为已遍历,对其相邻点进行广搜;

5:如果该位置为墙‘X‘,则将其跳过不便利;

如果队列为空,则说明在找到宝藏之前无可遍历位置,则返回0,表示未能找到宝藏;

时间: 2024-08-10 02:09:51

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 迷宫寻宝(一)

# 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 n

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,他能不能顺利的得到宝藏. 输入