【题目链接:NYOJ-82

#include<iostream>
#include<cstring>
using namespace std;
struct node{
int x1;
int y1;
int num;
}arry[];
const int MAXN = ;
char Map[MAXN][MAXN]; int ac;
int havekey[];
int findkey[]; void check(); void dfs(int x,int y){
if(Map[x][y] != 'X'){
switch(Map[x][y]){
case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
findkey[Map[x][y] - 'a']++;
break;
case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
arry[Map[x][y] - 'A'].x1 = x;
arry[Map[x][y] - 'A'].y1 = y;
arry[Map[x][y] - 'A'].num++;
return;
case 'G':
ac = true;
return;
}
Map[x][y] = 'X'; //标记已经走过
dfs(x - ,y);
dfs(x + ,y);
dfs(x,y - );
dfs(x,y + );
check();
}
}
void check(){
for(int i = ;i < ;i++){
if(arry[i].num){
if(findkey[i] == havekey[i]){
Map[arry[i].x1][arry[i].y1] = 'X';
dfs(arry[i].x1 + ,arry[i].y1);
dfs(arry[i].x1 - ,arry[i].y1);
dfs(arry[i].x1,arry[i].y1 + );
dfs(arry[i].x1,arry[i].y1 - );
}
}
}
}
int main(){
int m,n;
while((cin >> m >> n) && (m || n)){
memset(havekey,,sizeof(havekey));
memset(findkey,,sizeof(findkey));
memset(arry,,sizeof(arry));
memset(Map,'X',sizeof(Map));//初始边界,否则递归搜索时,会越界空指针
ac = ; int a1,b1; for(int i = ;i <= m;i++){
for(int j = ;j <= n;j++){
cin >> Map[i][j];
if(Map[i][j] == 'S')
a1 = i,b1 = j;
else if(Map[i][j] >= 'a' && Map[i][j] <= 'e')//将其保存至数组
havekey[Map[i][j] - 'a']++;
}
}
dfs(a1,b1);
if(ac){
cout << "YES" << endl;
}else cout << "NO" << endl;
}
return ;
}
//4 4
//S.X.
//a.X.
//..XG
//....
//3 4
//S.Xa
//.aXB
//b.AG
//0 0

【DFS】NYOJ-82 迷宫寻宝(一)-条件迷宫问题的更多相关文章

  1. nyoj 82 迷宫寻宝(一)

    点击打开链接 迷宫寻宝(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫 ...

  2. 福州大学第十五届程序设计竞赛_重现赛B题迷宫寻宝

    Problem B 迷宫寻宝 Accept: 52    Submit: 183Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem De ...

  3. Unity3D实现立体迷宫寻宝

    Unity3D实现立体迷宫寻宝 这个小游戏是一个白痴在一个昏暗的房间走动找到关键得分点,然后通关游戏.入门Unity3D做的第一款游戏,比较无聊,但实现了一般的游戏功能.如,人物控制,碰撞检测,主控制 ...

  4. 迷宫寻宝(一)(bfs)

    迷宫寻宝(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫里有N个编 ...

  5. Problem 2285 迷宫寻宝 (BFS)

    题目链接:http://acm.fzu.edu.cn/problem.php?pid=2285 Problem 2285 迷宫寻宝 Accept: 323    Submit: 1247Time Li ...

  6. NYOJ82 迷宫寻宝(一)【BFS】

    迷宫寻宝(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描写叙述 一个叫ACM的寻宝者找到了一个藏宝图.它依据藏宝图找到了一个迷宫,这是一个非常特别的迷宫,迷宫里有N个 ...

  7. nyoj 82 迷宫寻宝(二)

    http://acm.nyist.net/JudgeOnline/problem.php?pid=83 题目解法主要在于判断两线段是否相交,思路是穷举所有地图四周的点,其中每一个边界上的点和终点构成一 ...

  8. ZOJ 2110 Tempter of the Bone(条件迷宫DFS,HDU1010)

    题意  一仅仅狗要逃离迷宫  能够往上下左右4个方向走  每走一步耗时1s  每一个格子仅仅能走一次且迷宫的门仅仅在t时刻打开一次  问狗是否有可能逃离这个迷宫 直接DFS  直道找到满足条件的路径 ...

  9. nyist 82迷宫寻宝(一)(BFS)

    题目连接:http://acm.nyist.net/JudgeOnline/problem.php?pid=82 此题在基础BFS上加入了门和钥匙,要找齐所有钥匙才能开门,所以要对门特殊处理. 1.先 ...

随机推荐

  1. 输入一个字符串,内有数字和非数字字符,将其中连续的数字作为一个整数,依次存放到一数组a中。统计共有多少个整数,并输出这些数。

      #include<stdio.h> #include<stdlib.h> #include<math.h> #include<string.h> i ...

  2. linux源代码阅读笔记 linux文件系统(转)

    linux文件系统:   操作系统的文件数据除了文件实际内容外,还有非常多的属性,如文件权限(rwx)与文件属性(所有者.群组.时间参数等).   文件系统通常将这两部分数据存放在不同的块.权限属性放 ...

  3. 用supervisor控制celery时的脚本

    注意启停的先后顺序及判断即可. 这样,在更改task之后,要重启就方便很多啦.. #!/bin/sh supervisord_count=`ps -elf | grep celery | grep - ...

  4. XML中如何使用schema

    Schema简介 DTD的语法相当复杂,并且它不符合XML文件的标准,自成一个体系,W3C定义的Schema用来代替DTD. chema相对于DTD的明显好处是XML Schema文档本身也是XML文 ...

  5. 简单的线程同步问题:两个线程交替执行N次【Synchronized、Lock、ArrayBlockingQueue】

    方法一:传统的线程方法import org.apache.log4j.Logger; /** * 两个线程执行的代码片段要实现同步互斥的效果,它们必须用同一个Lock对象.<br/> * ...

  6. *[topcoder]PalindromicSubstringsDiv2

    http://community.topcoder.com/stat?c=problem_statement&pm=12967 计算一个字符串里Palindrome的数量.我的DP方法需要n^ ...

  7. linux下安装Apache(https) 服务器证书安装配置指南

    一.  安装准备 1.    安装Openssl 要使Apache支持SSL,需要首先安装Openssl支持.推荐下载安装openssl-0.9.8k.tar.gz   下载Openssl:http: ...

  8. [Unity菜鸟] 射线

    1. 射线用 Physics.Raycast 都可以判断,用 collider.Raycast 只在某些(不明)情况下可以 void Update() { Ray ray = Camera.main. ...

  9. REACTOS(193)与汇编编译器(69)的高人

    REACTOS(193)与汇编编译器(69)的高人http://blog.csdn.net/caimouse ReactOS编译成VS工程1: 首先从https://www.reactos.org/w ...

  10. Android 给listview设置分割线与边界的距离

    ListView可通过配置 android:dividerline android:dividerHeight 来实现分割listview中item的效果,如图: 如果想跟上图一样实现这种有设计的分割 ...