Poweroj:来自学长的善意:ZQ的杀龙之旅(状压BFS)
传送门:https://www.oj.swust.edu.cn/problem/show/2794
来自学长的善意:ZQ的杀龙之旅
Time Limit: 15000 MS Memory Limit: 65536 KB
Total Submit: 56 Accepted: 15 Page View: 127
Description
在西科大龙山上封印着一条邪恶的黑龙,不久即将苏醒,传说如果集齐所有的正义之剑,就可以再次封印黑龙
正义的骑士ZQ,为了封印黑龙,走上了寻找正义之剑的旅程。。。。
为了简化问题我们把整个世界看成一个n行m列的二维平面,在这个平面内只会存在下面几种符号:
“I” 代表ZQ当前的位置。
“O” 代表黑龙的位置。
“X” 代表障碍物。
“_” 代表正常的道路
“+” 代表一把正义之剑。
由于ZQ腿比较短,他只能一次花费一天的时间移动到他的相临(上下左右)的位置
由于时间原因他需要尽快的封印黑龙,因此他需要知道最少需要多少天可以封印黑龙。
Input
第一行三个整数n(1<=n<=100),m(1<=m<=100),k(0<=k<=10),分别代表地图的行数,列数,正义之剑的把数;
然后,n行,每行m个字符代表地图的信息;
Output
输出一个整数,代表最少需要多少天XQ能封印黑龙,如果不能封印黑龙,则输出-1。
Sample Input
3 3 1
I_X
__O
__+
Sample Output
5
解题心得:
- 这个题是给学弟出新生赛的时候出的,当时叫CHY他们出一个BFS,结果他们弄了这个状压标记路径的BFS,弄得数据也十分不友善,删了一半多的数据程序都要跑十秒左右才能出来。比赛的时候场面十分尴尬。
- 思路还是比较简单的,唯一的难点就是正义之剑很多,去拿剑路径不可能简单的标记,那么考虑一下怎么才不算重复走,假如给每一把剑标记一个数字,重复走就只存在拿了相同组合的剑然后走之前拿了同样组合的剑走过的路。那么最多十把剑可能有多少种组合情况呢。2^10种,就可以用二进制表示,给剑标号,如果这个剑拿到了,那么代表这个剑的二进制位上面就用1来表示。然后正常标记,只有全为1的状态再走到龙所在的地方才算结束搜索。
#include <algorithm>
#include <queue>
#include <stdio.h>
using namespace std;
const int maxn = 110;
char maps[maxn][maxn];
bool vis[maxn][maxn][1<<11];
int n,m,k,all_x;
int dir[4][2] = {0,1,0,-1,1,0,-1,0};
struct Node {
int x,y,path,time;
}now,Next;
bool check(int x,int y) {
if(x < 1 || y < 1 || x > n || y > m || maps[x][y] == 'X')
return true;
return false;
}
void init() {
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;i++)
scanf("%s",maps[i]+1);
int cnt = 0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) {
if(maps[i][j] == '+') {
maps[i][j] = '0' + cnt++;//给每一把剑标号
}
if(maps[i][j] == 'I') {
now.x = i;
now.y = j;
now.path = 0;
now.time = 0;
}
}
all_x = (1<<k)-1;//最终拿到所有剑的状态
}
int bfs() {
queue <Node> qu;
qu.push(now);
while(!qu.empty()) {
now = qu.front();
qu.pop();
for(int i=0;i<4;i++) {
int x = now.x + dir[i][0];
int y = now.y + dir[i][1];
if(check(x,y))
continue;
Next.path = now.path;
Next.time = now.time + 1;
Next.x = x; Next.y = y;
if(maps[x][y] >= '0' && maps[x][y] <= '9')
Next.path |= (1 << (maps[x][y] - '0'));
if(maps[x][y] == 'O' && Next.path == all_x)
return Next.time;
if(vis[x][y][Next.path])
continue;
vis[x][y][Next.path] = true;
qu.push(Next);
}
}
return -1;
}
int main() {
init();
int ans = bfs();
printf("%d\n",ans);
return 0;
}
Poweroj:来自学长的善意:ZQ的杀龙之旅(状压BFS)的更多相关文章
- QDUOJ 来自xjy的签到题(bfs+状压dp)
来自xjy的签到题 Description 爱丽丝冒险来到了红皇后一个n*n大小的花园,每个格子由'.'或'#'表示,'.'表示爱丽丝可以到达这个格子,‘#’表示爱丽丝不能到达这个格子,爱丽丝每1 ...
- 来自学长&师兄们的应届校招经验
PART1 记得三月的第一个星期五吧,小操场打球,偶遇一位研三师兄,就主动跟师兄聊起了校招求职.很高兴,能遇到一位愿意跟你分享他自己求职经验的师兄,师兄也很热情,我们聊了好多.下面,开始 ...
- 来自MyBatis不一样收获结果的探索之旅-v3.5.9
概述 定义 MyBatis官网 https://mybatis.org/mybatis-3/ 最新版本为3.5.9 MyBatis是一个的ORM框架,支持自定义SQL.存储过程和高级映射.MyBati ...
- 2017/10 冲刺NOIP集训记录:暁の水平线に胜利を刻むのです!
前几次集训都没有记录每天的点滴……感觉缺失了很多反思的机会. 这次就从今天开始吧!不能懈怠,稳步前进! 2017/10/1 今天上午进行了集训的第一次考试…… 但是这次考试似乎是近几次我考得最渣的一次 ...
- 【刷题笔记】DP优化-状压
因为篇幅太长翻着麻烦,计划把DP拆成几个小专题,这里原文只留下状压,其他请至后续博文. 状态压缩优化 所谓状态压缩,就是将原本需要很多很多维来描述,甚至暴力根本描述不清的状态压缩成一维来描述. 时间复 ...
- 【笔记】学习markdown
经过来自学长(姐?)的 嘲讽 善意提醒后,我才知道这个博客园好像 资瓷 markdown 于是我决定要认真学习markdown(绝不是因为洛谷题解又过不去了) 正常点: 由于没人教,我上网查了一下 一 ...
- 【腾讯Bugly干货分享】QQ电话适配iOS10 Callkit框架
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/58009392302e4725036142fc Dev Club 是一个交流移动 ...
- 互联网云生态下DDOS安全产品的一些考虑和测试方法(一)
DDOS攻击简介 安全的三要素——“保密性”.“完整性”和“可用性”中,DOS(Denial of Service拒绝服务攻击)所针对的目标是服务的“可用性”.这种攻击方式利用目标系统的网络服务功能缺 ...
- 洛谷4月月赛R1 Happy Poppin' Party Train
来自FallDream的博客,未经允许,请勿转载,谢谢. 听学长说的就来玩一玩,随便乱打打 没想到一堆人被取消了成绩,莫名混了个Rank3 还有第一题数据肯定是有问题 --------------- ...
随机推荐
- 1像素border
1像素border 利用伪类和媒体查询: 伪类: border-1px($color) position:relative &:after display: block position: a ...
- <Android 基础(八)> Palette
介绍 Palette, 英文翻译,调色板,意思比较接近,Google给它的定位应该是颜色萃取器. 看下Source Code Palette , A helper class to extract p ...
- 《ArcGIS Runtime SDK for Android开发笔记》——翻译:ArcGIS Runtime SDK for Android 10.2.7发布
ArcGIS Runtime SDK for Android v10.2.7 released by Dan O'Neill on October 1, 2015(发布时间:2015年10月1日) W ...
- 【Angular JS】正确调用JQuery与Angular JS脚本 - 修复Warning: Tired to load angular more than once
自己正在做一个小网站,使用Angular JS + Express JS + Mongo DB,在开发过程中,遇到一些问题,所以整理出来.希望对大家都有帮助. 这是今天解决的一个问题,Angular ...
- 服务器raid状态监控
参考 http://hwraid.le-vert.net/wiki 查看raid芯片 lspci -v 02:00.0 SCSI storage controller: LSI Logic / Sym ...
- python JSON性能测试与simplejson对比
简单测试了一下,如果用JSON,也就是python2.6以上自带的json处理库,效率还算可以: 1K的数据,2.9GHz的CPU,单核下每秒能dump:36898次.大约是pyamf的5倍.但数据量 ...
- simotion读写CF卡,保存/读取变量
simotion读写CF卡功能 1 使用西门子的Simotion运动控制器时,有时需要用到 读/写 CF卡的功能.主要来自以下几个方面的需求. 1)用户数据量较大,可保持(retain)存储区的容量不 ...
- @RequestMapping,@ResponseBody,@RequestBody用法
本文转载:http://blog.csdn.net/ff906317011/article/details/78552426 1.@RequestMapping 国际惯例先介绍什么是@RequestM ...
- ORA-01262,oracle启动报错,及Oracle启动原理
错误状态: SQL> startup ORA-01261: Parameter db_recovery_file_dest destination string cannot be transl ...
- kubernetes-身份与权限认证(十四)
Kubernetes的安全框架 https://kubernetes.io/docs/reference/access-authn-authz/rbac/ •访问K8S集群的资源需要过三关:认证.鉴权 ...