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 还有第一题数据肯定是有问题 --------------- ...
随机推荐
- better-scroll 遇到的问题 1
备注:better-scroll 实现下拉,是父子层的结构,父层的第一个子元素,如果超出父容器,那么就可以实现下拉 问题: 今天在使用better-scroll实现下拉功能,遇到了一个问题 &quo ...
- Android GreenDao清空数据库的方法
最近在做项目的时候,为了方便测试人员测试,在应用中加入正式库和测试库切换的功能.为了防止正式库和测试库切换带来的数据冲突,切换的时候必须把当前的数据库清空.代码如下: package com.exam ...
- WHRER条件里的数据类型必须和字段数据类型一致
首先看案例: 表中字段FPHONE_IMEI是varchar类型的,主键也建立在FPHONE_IMEI 字段上,原则上只要where条件中用到了这个字段,就会走索引,这也是建立索引的目的,可事实是这样 ...
- Java学习笔记——集合
类集简介 从JDK1.2开始Java引入了类集开发框架,所谓的类集指的就是一套动态对象数组的实现方案,在实际开发之中没有有何一项开发可以离开数组,但是传统的数组实现起来非常的繁琐.而且长度是其致命伤, ...
- 在unbuntu 1204(32位)下安装hadoop2.2.0的一些问题
虽然在网上可以找到很多这样的step by step的教程,但是我还是遇到了很多问题.趁着一点记忆,将这些问题记录下来.安装过程参考了以下博客: http://www.cnblogs.com/life ...
- java最大最小堆
堆是一种经过排序的完全二叉树,其中任一非终端节点的数据值均不大于(或不小于)其左孩子和右孩子节点的值. 最大堆和最小堆是二叉堆的两种形式. 最大堆:根结点的键值是所有堆结点键值中最大者. 最小堆:根结 ...
- python3绘图示例6-1(基于matplotlib,绘图流程介绍及设置等)
#!/usr/bin/env python# -*- coding:utf-8 -*- import os import pylab as pyimport numpy as npfrom matpl ...
- 创建Gradle工程出现Could not install Gradle distribution from 'https://services.gradle.org/distributions/gradleXX'.问题解决
在 Eclipse EE Oxygen 中创建 Gradle Project的时候 出现如下错误: org.gradle.tooling.GradleConnectionException: Coul ...
- JavaScript 常用的Math对象
Math.ceil(x); //返回x向上取整后的整数值. Math.floor(x); //返回x向下取整后的整数值.. Math.round(x); //返回四舍五入后的整数. Math.abs( ...
- phpStudy:使用localhost无法访问的解决方案
今天遇到新的问题,很有意思,当使用Localhost时,发现报403错误: 百度找到问题所在:没有权限问题 所以我们打开phpStudy,找到配置文件“vhosts-conf”,看到的情况是这样的 接 ...