题目:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=82

  2018-06-23 23:44:05 p.s.自己省错题了:

描述

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

  这里重点是开门前必须找到所有这个门对应的钥匙 orz。。。


  目前难点在于,这样的情况:

4 7
S.Aa.X.
a.Xc.C.
b.X..DG
.cB..Xd

  该数据太恶心...一时半会儿没想到办法。

  2018-06-28 17:51:14 p.s.今天看了又去一下昨天的结果,已显示该题AC了。

  思路:记录迷宫中所有钥匙分别有多少,判断是否集齐该门对应的所有钥匙,如果没有集齐则将前一个位置记录到队列中。

  2018-06-27 11:00:59 p.s.终于写出来了,这下应该对了,测试数据:

$ ./test
4 7
S.Aa.X.
a.Xc.C.
b.X..DG
.cB..Xd
YES
X X A X X X .
X X X X X C X
X X X X X D G
X X B X X X d
3 6
SbAdX.
a.BD.G
cBCdaX
YES
X X A X X .
X X B D X G
X B C X X X
4 4
S.X.
a.X.
..XG
....
YES
X X X .
X X X .
X X X G
X X X X
3 4
S.Xa
.aXB
b.AG
NO
X X X a
X X X B
X X A G

  但oj上显示结果是:判题中...?!这是什么鬼 > < #(貌似是服务端内部错误。。。。

  代码:

#include <bits/stdc++.h>
using namespace std;
struct ss
{
int i, j;
ss() {}
ss(int x, int y) : i(x), j(y) {}
void startpoint(int x, int y) { i = x, j = y; }
};
#define Index(c) ((c) - 'a')
int key[5], dir[4][2] = { 1, 0, -1, 0, 0, 1, 0, -1 };
int a, b, c, d, e;
bool bfs(vector<vector<char> > & maze, ss ps)
{
memset(key, 0, sizeof(key));
queue<ss> q, door;
q.push(ps);
maze[ps.i][ps.j] = 'X';
while(!q.empty())
{
ps = q.front();
q.pop();
for (int i = 0; i < 4; i++)
{
ss n(ps.i + dir[i][0], ps.j + dir[i][1]);
char ch = 0;
if (n.i > -1 && n.i < maze.size() && n.j > -1 && n.j < maze[0].size())
{
if (maze[n.i][n.j] == 'G')
return true;
ch = maze[n.i][n.j];
if (ch != 'X')
{
switch(ch)
{
case 'A': if (key[0] == a) q.push(n);
else door.push(ps); break;
case 'B': if (key[1] == b) q.push(n);
else door.push(ps); break;
case 'C': if (key[2] == c) q.push(n);
else door.push(ps); break;
case 'D': if (key[3] == d) q.push(n);
else door.push(ps); break;
case 'E': if (key[4] == e) q.push(n);
else door.push(ps); break;
}
if (ch == '.')
{
q.push(n);
maze[n.i][n.j] = 'X';
}
else if (ch == 'a' || ch == 'b' || ch == 'c' || ch == 'd' || ch == 'e')
{
key[Index(ch)]++;
while(!door.empty())
{
q.push(door.front());
door.pop();
}
q.push(n);
maze[n.i][n.j] = 'X';
}
}
}
}
}
return false;
}
int main()
{
int i, j; while(1)
{
a = 0, b = 0, c = 0, d = 0, e = 0;
ss ps;
cin >> i >> j;
if (i == 0 && j == 0)
break;
vector<vector<char> > maze(i, vector<char>(j));
for (int i = 0; i < maze.size(); i++)
for( int j = 0; j < maze[0].size(); j++)
{
cin >> maze[i][j];
switch(maze[i][j])
{
case 'S': ps.startpoint(i, j); break;
case 'a': a++; break;
case 'b': b++; break;
case 'c': c++; break;
case 'd': d++; break;
case 'e': e++; break;
}
}
if (bfs(maze, ps))
cout << "YES" << endl;
else
cout << "NO" << endl;
/*
for (int i = 0; i < maze.size(); i++)
{
for( int j = 0; j < maze[0].size(); j++)
cout << maze[i][j] << ' ';
cout << endl;
}
*/
}
return 0;
}

  

  

nyoj 82的更多相关文章

  1. nyoj 82 迷宫寻宝(二)

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

  2. nyoj 82 迷宫寻宝(一)

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

  3. NYOJ 1007

    在博客NYOJ 998 中已经写过计算欧拉函数的三种方法,这里不再赘述. 本题也是对欧拉函数的应用的考查,不过考查了另外一个数论基本定理:如何用欧拉函数求小于n且与n互质所有的正整数的和. 记eule ...

  4. NYOJ 998

    这道题是欧拉函数的使用,这里简要介绍下欧拉函数. 欧拉函数定义为:对于正整数n,欧拉函数是指不超过n且与n互质的正整数的个数. 欧拉函数的性质:1.设n = p1a1p2a2p3a3p4a4...pk ...

  5. NYOJ 333

    http://www.cppblog.com/RyanWang/archive/2009/07/19/90512.aspx?opt=admin 欧拉函数 E(x)表示比x小的且与x互质的正整数的个数. ...

  6. Bullet核心类介绍(Bullet 2.82 HelloWorld程序及其详解,附程序代码)

    实验平台:win7,VS2010 先上结果截图: 文章最后附有生成该图的程序. 1. 刚体模拟原理 Bullet作为一个物理引擎,其任务就是刚体模拟(还有可变形体模拟).刚体模拟,就是要计算预测物体的 ...

  7. windows下Bullet 2.82编译安装(Bullet Physics开发环境配置)

    平台:Win7,VS2010 1. Bullet库的组织 下图是Bullet_User_Manual中的截图: 从中可见,Bullet的LinearMath(线性数学模块),其上是BulletColl ...

  8. NYOJ 99单词拼接(有向图的欧拉(回)路)

    /* NYOJ 99单词拼接: 思路:欧拉回路或者欧拉路的搜索! 注意:是有向图的!不要当成无向图,否则在在搜索之前的判断中因为判断有无导致不必要的搜索,以致TLE! 有向图的欧拉路:abs(In[i ...

  9. nyoj 10 skiing 搜索+动归

    整整两天了,都打不开网页,是不是我提交的次数太多了? nyoj 10: #include<stdio.h> #include<string.h> ][],b[][]; int ...

随机推荐

  1. 安装k8s出现 Failed to list *api.Node: Get http://192.168.144.131:8080...: dial tcp 192.168.144.131:8080: getsockopt: no route to

    原因是master主机的防火墙没关,导致无法访问主机的8080端口,解决方法暂时关闭主机上的防火墙. * centos6 : service iptables stop * centos7 : sys ...

  2. Vue学习 Day01

    介绍 这个系列记录自己学习Vue的过程. Vue官方不推荐新手直接使用 vue-cli,所以前面这几天都是根据官方文档学习. 步骤 新建一个html文件. 在html中导入vue.js依赖. < ...

  3. Axure licensee key 8~9-转

    转:https://7rp.cn/34 AxureRP v9.0.0.3646 正式版 — 亲测可用 Licensee: jasmine Key: ATocOwMG75ijKpF0OEDSHQ3UZQ ...

  4. 2.4 【配置环境】TestNG安装

    两种方法可以安装TestNG Eclipse插件:  (来源:http://blog.csdn.net/hongchangfirst/article/details/7679849/) 第一种,离线安 ...

  5. wampserver 配置的几个坑(雾

    1. 从安装版本说起 自从我进入大学之后,便继承了学长那里的wampserver2.5版本 直到有一天自己下载wamp的时候才注意到已经有 3.0.6版本了 (现在有更高的了 但是3.0.6够用了) ...

  6. 并发之CountDownLatch用法详解

    概念 CountDownLatch 是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程执行完后再执行.例如,应用程序的主线程希望在负责启动框架服务的线程已经启动所有的框架服务之后执行. Co ...

  7. Vue.js 学习入门:介绍及安装

    Vue.js 是什么? Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层 ...

  8. Codeforces Round #614 (Div. 2)E(思维,构造,DP)

    构造边权,从0开始给边赋值,初始选取一条边权为0,每次赋值的贡献为这一条链两侧的结点(包含链的端点)个数之积,下一次赋值以当前链其一端点续一条边,边权为上次赋的值+1.先DFS找到点的组合这条链两侧结 ...

  9. Go非缓冲/缓冲/双向/单向通道

    1. 非缓冲和缓冲 package main import ( "fmt" "strconv" ) func main() { /* 非缓冲通道:make(ch ...

  10. 网站复制工具:HTTrack

    HTTrack简介: HTTrack是Kali中内置的工具,主要用于克隆网站.渗透测试人员可以利用它来在自主可控制的环境中查看该网站的完整内容:所有离线文件.同时可以利用该网站的副本来开发假冒的钓鱼网 ...