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 还有第一题数据肯定是有问题 --------------- ...
随机推荐
- BZOJ4260: Codechef REBXOR (01Tire树)
题意 题目链接 Sol 首先维护出前缀xor和后缀xor 对每个位置的元素插入到Trie树里面,每次找到和该前缀xor起来最大的元素 正反各做一遍,取最大. 记得要开log倍空间qwq.. #incl ...
- 零基础逆向工程36_Win32_10_互斥体_互斥体与临界区的区别
1 引言 讲了第二个内核对象,互斥体.前面已经学过一个内核对象,线程.这节讲两个函数,WaitForSingleObject()和WaitForMultipleObjects().因此这两个函数是根据 ...
- 【起航计划 005】2015 起航计划 Android APIDemo的魔鬼步伐 04 App->Activity->Custom Dialog Dialog形式的Activity,Theme的使用,Shape的使用
App->Activity->Custom Dialog 例子使用Activity 来实现自定义对话框 类CustomDialogActivity本身无任何特别之处.关键的一点是其在And ...
- centos7.4 系统安装指导
centos7 系统安装指导 安装前规划 下载安装文件 安装过程设置 安装后系统基本设置 安装前规划 CentOS 7.x系列只有64位系统,没有32位. 生产服务器建议安装CentOS-7-x86_ ...
- check_mk手动安装
官方omd rpm包安装 yum -y install /tmp/check-mk-raw-1.2.6p2.demo-el6-34.x86_64.rpm omd create la omd confi ...
- Selenium入门系列4 选择并操作一组元素
选中一组元素的方式也是8种,与选中单个元素一一对应.区别只在于element与elements.elements取到的是一个数组,element取符合条件的第一个元素. 首先在脚本的目录下新建test ...
- AJAX(四):XHR2支持的方法
XMLHttpRequest 1级只是把已有的XHR对象的实现细节描述了出来.而XMLHttpRequest 2级则进一步发展了XHR FormDataFormData为序列化表单以及创建与表单格式相 ...
- Linux内存管理 - buddy系统
本文目的在于分析Linux内存管理机制中的伙伴系统.内核版本为2.6.31.1. 伙伴系统的概念 在系统运行过程中,经常需要分配一组连续的页,而频繁的申请和释放内存页会导致内存中散布着许多不连续的页, ...
- 八数码(map版)
八数码 map真是个奇技淫巧好东西 可以十分简单的实现hash,当然速度就不敢保证了 因为九位数不算很大,完全可以用int存下,所以便将八数码的图像转换成一个int型的数字 #include<i ...
- CUDA Texture纹理存储器 示例程序
原文链接 /* * Copyright 徐洪志(西北农林科技大学.信息工程学院). All rights reserved. * Data: 2012-4-20 */ // // 此程序是演示了1D和 ...