[POJ2157]Maze(DFS)

题目链接:http://poj.org/problem?id=2157

题意:给一张地图,地图里有门和钥匙,想要开门必须集齐所有钥匙。给定起点和终点,问从起点出发能否到达终点。

爆搜floodfill,每填一次考虑是否到达终点,并且把门都开开,钥匙都拿上,再进行下一次,其实可以不重复200次,备份一下上一次的状态图,再比对floodfill后的与当前的是否不同即可。

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <iomanip>
 4 #include <cstring>
 5 #include <climits>
 6 #include <complex>
 7 #include <cassert>
 8 #include <cstdio>
 9 #include <bitset>
10 #include <vector>
11 #include <deque>
12 #include <queue>
13 #include <stack>
14 #include <ctime>
15 #include <set>
16 #include <map>
17 #include <cmath>
18 using namespace std;
19 
20 const int maxn = 22;
21 const int dx[5] = {1, -1, 0, 0};
22 const int dy[5] = {0, 0, 1, -1};
23 int n, m;
24 int sx, sy;
25 int kn[6], ck[6];
26 char G[maxn][maxn], H[maxn][maxn];
27 bool vis[maxn][maxn];
28 bool done;
29 
30 bool ok(int x, int y) {
31     return x >= 0 && y >= 0 && x < n && y < m;
32 }
33 
34 void dfs(int x, int y) {
35     if(done) return;
36     if(vis[x][y]) return;
37     vis[x][y] = 1;
38     for(int i = 0; i < 4; i++) {
39         int xx = x + dx[i];
40         int yy = y + dy[i];
41         if(!ok(xx, yy)) continue;
42         if(G[xx][yy] == 'X') continue;
43         if(vis[xx][yy]) continue;
44         if(G[xx][yy] >= 'A' && G[xx][yy] <= 'E') {
45             if(ck[G[xx][yy]-'A'] == kn[G[xx][yy]-'A']) {
46                 G[xx][yy] = '.';
47                 dfs(xx, yy);
48             }
49         }
50         else if(G[xx][yy] >= 'a' && G[xx][yy] <= 'e') {
51             ck[G[xx][yy]-'a']++;
52             G[xx][yy] = '.';
53             dfs(xx, yy);
54         }
55         else if(G[xx][yy] == 'G') {
56             done = 1;
57             return;
58         }
59         else if(G[xx][yy] == '.') dfs(xx, yy);
60     }
61 }
62 
63 int main() {
64     // freopen("in", "r", stdin);
65     while(~scanf("%d%d",&n,&m)&&n+m) {
66         memset(kn, 0, sizeof(kn));
67         memset(ck, 0, sizeof(ck));
68         memset(G, 0, sizeof(G));
69         memset(vis, 0, sizeof(vis));
70         for(int i = 0; i < n; i++) scanf("%s", G[i]);
71         for(int i = 0; i < n; i++) {
72             for(int j = 0; j < m; j++) {
73                 if(G[i][j] >= 'a' && G[i][j] <= 'e') kn[G[i][j]-'a']++;
74                 if(G[i][j] == 'S') sx = i, sy = j;
75             }
76         }
77         done = 0;
78         for(int _ = 0; _ < 200; _++) {
79             memset(vis, 0, sizeof(vis));
80             dfs(sx, sy);
81             if(done) break;
82         }
83         if(done) puts("YES");
84         else puts("NO");
85     }
86     return 0;
87 }

 

转载于:https://www.cnblogs.com/kirai/p/6437978.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/401540.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WPF程序将DLL嵌入到EXE的两种方法

2019独角兽企业重金招聘Python工程师标准>>> WPF程序将DLL嵌入到EXE的两种方法 这一篇可以看作是《Visual Studio 版本转换工具WPF版开源了》的续&#xff0c;关于《Visual Studio 版本转换工具WPF版开源了》可以参看地下地址&#xff08;两篇是一样的&#xff09;&…

华中地区高校第七届ACM程序设计大赛——之字形矩阵【2012年5月27日】

题意&#xff1a;输入a b Right 或 a b Down ,根据输入输出之字形路径的矩阵。 1 #include <stdio.h>2 int xx[4]{0,1,-1,1},yy[4]{1,0,1,-1};3 int map[100][100],col,row,x,y,dir,steps,idx;4 char sel[10];5 void nextdir()6 {7 switch(dir)8 {9 case 0: …

Javascript 常见使用误区

Javascript常见使用误区 1&#xff09;比较运算符&#xff1a; var x 0; if (x 10) // true if (x 0) // falsevar x 10; var y "10"; if (x y) // true if (x y) // false 恒等计算符&#xff0c;同时检查表达式的值与类型var x 10; switch(x) { //执行ca…

内存泄漏和内存溢出的优化

内存泄漏&#xff1a; 对象在内存heap堆中中分配的空间&#xff0c; 当不再使用或没有引用指向的情况下&#xff0c; 仍不能被GC正常回收的情况。 多数出现在不合理的编码情况下&#xff0c; 比如在Activity中注册了一个广播接收器&#xff0c; 但是在页面关闭的时候进行unRegi…

使用ftp搭建yum源问题解决

wget 无法连接的情况 关闭linux 防火墙 1) 重启后生效 开启&#xff1a; chkconfig iptables on 关闭&#xff1a; chkconfig iptables off 2) 即时生效&#xff0c;重启后失效 开启&#xff1a; service iptables start 关闭&#xff1a; service iptables stop 需要说明的是对…

oracle文件

1、控制文件和日志文件 控制文件&#xff08;Control File&#xff09;是一个很小的二进制文件&#xff0c;用于描述和维护数据库的物理结构。在Oracle数据库中&#xff0c;控制文件相当重要&#xff0c;它存放有数据库中数据文件和日志文件的信息。Oracle数据库在启动时需要访…

Javascript this关键字 指向详解

Javascript this关键字 指向详解 面向对象语言中 this 表示当前对象的一个引用。在 JavaScript 中 this 不是固定不变的&#xff0c;它会随着执行环境的改变而改变。 1&#xff09; 单独使用&#xff0c;this 表示全局对象。 <script type"text/javascript">…

storyboard隐藏iphone软键盘

xcode 4.3.2 storyboard ** 点击软键盘的return键隐藏软键盘 .h文件定义IBAction -(IBAction)textFieldReturn:(id)sender; .m文件实现 -(IBAction)textFieldReturn:(id)sender{[sender resignFirstResponder];//关键代码 } storyboard中&#xff0c;选中文本框&#xff0c;查…

常用命令-tar 加密

2019独角兽企业重金招聘Python工程师标准>>> 在当前目录下有一个pma目录的文件夹: 1、使用tar对文件压缩加密&#xff1a; # tar -zcvf - pma|openssl des3 -salt -k password | dd ofpma.des3 完成将得到一个pma.des3的打包文件&#xff0c;用你设置的密码替换pas…

ORM SQLAlchemy 简介

对象关系映射&#xff08;Object Relational Mapping&#xff0c;简称ORM使用DB-API访问数据库&#xff0c;需要懂 SQL 语言&#xff0c;能够写 SQL 语句&#xff0c;如果不想懂 SQL&#xff0c;又想使用关系型数据库&#xff0c;可以使用 ORM,一个 ORM , 它的一端连着 Databas…

Javascript let和const

Javascript let和const 在 ES6 之前&#xff0c;JavaScript 只有两种作用域&#xff1a; 全局变量 &#xff1a; 在函数外声明的变量作用域是全局的 局部变量&#xff08;函数变量&#xff09;&#xff1a;在函数内声明的变量作用域是局部的 <script type"text/jav…

Javascript JSON格式

Javascript JSON格式 1&#xff09;什么是JSON&#xff08;JavaScript Object Notation&#xff09;&#xff1f; 是一种轻量级的数据交换格式 是独立的语言 2&#xff09;JSON 语法规则 数据为 键/值 对 数据由逗号分隔 大括号保存对象 方括号保存数组 JSON 对象&#xff…

转:OAUTH协议简介

OAUTH协议简介 原文链接 摘要&#xff1a;OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAUTH的授权不会使第 三方触及到用户的帐号信息&#xff08;如用户名与密码&#xff09;&#xff0c;即第三方无需使用用户的用户名与密…

生产库自动派送报表派送失败之重新派送

/*Description: 生产库自动派送报表派送失败之重新派送 */USE [DB] --Replace yourDBGODECLARE ProductDate nvarchar(10) N2014-01-01DECLARE FactoryCode nvarchar(10) NXDECLARE strSQL nvarchar(3000)DECLARE strCRLF nvarchar(…

java集合框架05——ArrayList和LinkedList的区别

前面已经学习完了List部分的源码&#xff0c;主要是ArrayList和LinkedList两部分内容&#xff0c;这一节主要总结下List部分的内容。 List概括 先来回顾一下List在Collection中的的框架图&#xff1a; 从图中我们可以看出&#xff1a; 1. List是一个接口&#xff0c;它继承与Co…

Javascript 函数详解

Javascript 函数详解 1&#xff09;函数声明&#xff1a; 通过关键字function定义&#xff0c;把函数作为变量来声明 函数声明后不会立即执行&#xff0c;会在我们需要的时候调用到。 <script>function myFunction(a, b) {return a * b;}// js对大小写敏感&#xff0c;…

asp.net仿搜索引擎关键字高亮.搜索高亮

以前做关键字高亮都是直接使用replace方法直接替换 如 string input"AAbCC"; string keyword"b"; inputinput.ToUpp(); keywordkeyword.ToUpp(); ss.Replace(keyword,"<font>"keyword"</font>"); 如果这样 输出: "AA…

easyui validatebox 验证类型

required: "必选字段", remote: "请修正该字段", email: "请输入正确格式的电子邮件", url: "请输入合法的网址", date: "请输入合法的日期", dateISO: "请输入合法的日期 (ISO).&…

SSL 1461——最大连续数列的和

Description 求最大连续子序列的和 Input 第一行输入n(n<500),第二行为n个以空格分开的整数(-1000到1000之间)&#xff1b; Output 该序列中最大的连续子序列的和 Sample Input &#xff16;   1 2 -5 6 7 8 Sample Output 21 每次读入一个数判断它是否为负数&#xff0…

ln链接使用

首先说明下Linux下删除、移动、复制的意义。删除:是将inode表放回空闲区由1变为0&#xff0c;还可以找回文件移动:是将inode表不变&#xff0c;将文件转移至对应条目&#xff0c;删除原条录。同分区上操作速度快&#xff0c;不同分区相当于创建、删除原文件复制:是重建inode表&…