传送门: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


解题心得:

  1. 这个题是给学弟出新生赛的时候出的,当时叫CHY他们出一个BFS,结果他们弄了这个状压标记路径的BFS,弄得数据也十分不友善,删了一半多的数据程序都要跑十秒左右才能出来。比赛的时候场面十分尴尬。
  2. 思路还是比较简单的,唯一的难点就是正义之剑很多,去拿剑路径不可能简单的标记,那么考虑一下怎么才不算重复走,假如给每一把剑标记一个数字,重复走就只存在拿了相同组合的剑然后走之前拿了同样组合的剑走过的路。那么最多十把剑可能有多少种组合情况呢。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)的更多相关文章

  1. QDUOJ 来自xjy的签到题(bfs+状压dp)

    来自xjy的签到题   Description 爱丽丝冒险来到了红皇后一个n*n大小的花园,每个格子由'.'或'#'表示,'.'表示爱丽丝可以到达这个格子,‘#’表示爱丽丝不能到达这个格子,爱丽丝每1 ...

  2. 来自学长&师兄们的应届校招经验

    PART1        记得三月的第一个星期五吧,小操场打球,偶遇一位研三师兄,就主动跟师兄聊起了校招求职.很高兴,能遇到一位愿意跟你分享他自己求职经验的师兄,师兄也很热情,我们聊了好多.下面,开始 ...

  3. 来自MyBatis不一样收获结果的探索之旅-v3.5.9

    概述 定义 MyBatis官网 https://mybatis.org/mybatis-3/ 最新版本为3.5.9 MyBatis是一个的ORM框架,支持自定义SQL.存储过程和高级映射.MyBati ...

  4. 2017/10 冲刺NOIP集训记录:暁の水平线に胜利を刻むのです!

    前几次集训都没有记录每天的点滴……感觉缺失了很多反思的机会. 这次就从今天开始吧!不能懈怠,稳步前进! 2017/10/1 今天上午进行了集训的第一次考试…… 但是这次考试似乎是近几次我考得最渣的一次 ...

  5. 【刷题笔记】DP优化-状压

    因为篇幅太长翻着麻烦,计划把DP拆成几个小专题,这里原文只留下状压,其他请至后续博文. 状态压缩优化 所谓状态压缩,就是将原本需要很多很多维来描述,甚至暴力根本描述不清的状态压缩成一维来描述. 时间复 ...

  6. 【笔记】学习markdown

    经过来自学长(姐?)的 嘲讽 善意提醒后,我才知道这个博客园好像 资瓷 markdown 于是我决定要认真学习markdown(绝不是因为洛谷题解又过不去了) 正常点: 由于没人教,我上网查了一下 一 ...

  7. 【腾讯Bugly干货分享】QQ电话适配iOS10 Callkit框架

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/58009392302e4725036142fc Dev Club 是一个交流移动 ...

  8. 互联网云生态下DDOS安全产品的一些考虑和测试方法(一)

    DDOS攻击简介 安全的三要素——“保密性”.“完整性”和“可用性”中,DOS(Denial of Service拒绝服务攻击)所针对的目标是服务的“可用性”.这种攻击方式利用目标系统的网络服务功能缺 ...

  9. 洛谷4月月赛R1 Happy Poppin' Party Train

    来自FallDream的博客,未经允许,请勿转载,谢谢. 听学长说的就来玩一玩,随便乱打打  没想到一堆人被取消了成绩,莫名混了个Rank3 还有第一题数据肯定是有问题 --------------- ...

随机推荐

  1. jQuery中的CSS-DOM操作

    html代码 <p style="color:blue;">武汉PHP培训-武汉长乐教育</p> css()方法 $("p").css( ...

  2. Vue.js - Day3

    定义Vue组件 什么是组件: 组件的出现,就是为了拆分Vue实例的代码量的,能够让我们以不同的组件,来划分不同的功能模块,将来我们需要什么样的功能,就可以去调用对应的组件即可: 组件化和模块化的不同: ...

  3. Xxy 的车厢调度

    有 一 个 火 车 站 , 铁 路 如 图 所 示 ,每辆火车从 A 驶入, 再从 B 方向驶出,同时它的车厢可以重新组合.假设 从 A 方向驶来的火车有 n 节(n<=1000) ,分别按照顺 ...

  4. git 因线上分支名重复导致无法拉取代码

    有时 git pull 或 git fetch 时发现 git 报了个异常,说法像是无法将线上某个分支与本地分支合并,由于分支是...(很长的hash)但是分支却是...(很长的hash) 仔细查查后 ...

  5. Spring Cloud入门程序——注册服务提供者

    1.创建Spring Starter project 2.引入依赖 点击finish 3.创建启动类 package com.hello; import org.springframework.boo ...

  6. http缓存基本介绍

    https://www.helloweba.com/view-blog-414.html

  7. java调用dll库

    1.dll叫动态链接库,作用是用某种语言封装好某些函数生成可供不同语言调用的.dll文件,通常是用C++编写生成,因为C++可以对很多硬件操作方便而其他高级语言不行 2.dll生成参考:http:// ...

  8. 将Apache2.4手动安装成Windows的服务

    将Apache2.4手动安装成Windows的服务 可以选择在安装Apache时自动将其安装为一个服务.如果选择"for all users",那么Apache将会被安装为服务. ...

  9. 2017.9.29 web网上答题及其自动评测系统

    1. 设计计一个网上答题及其自动评测系统,首先是试题页面的设计及其解答的提交, 其次是当提交解答之后,系统自动评阅并给出结果. 分析:需要两个jsp页面:一个是提交信息的页面,另一个是获取提交信息的页 ...

  10. 剑指offer39 平衡二叉树

    剑指上用了指针传递,这里用的引用传递 class Solution { public: bool IsBalanced_Solution(TreeNode* pRoot) { ; return IsB ...