题意:

     给你一个n*m的地图,问你从起点出发,吧所有的宝藏都捡完用的最少时间。

思路:k <= 4,水题,直接开一个数组mark[now][x][y];now代表的是当前检宝藏的二进制压缩状态,然后就直接搜索就行了。


#include<stdio.h>
#include<string.h>
#include<queue> #define N 100 + 5

using namespace
std; typedef struct
{
int
x ,y ,now;
}
NODE; NODE xin ,tou;
int
mark[1<<4][N][N];
int
map[N][N];
int
dir[4][2] = {0 ,1 ,0 ,-1 ,1 ,0 ,-1 ,0};
NODE K[5];
int
n ,m ,k; bool ok(int x ,int y ,int now)
{
return
x <= n && x >= 1 && y <= m && y >= 1 && !mark[now][x][y] && map[x][y];
} int
BFS(int sx ,int sy)
{

queue<NODE>q;
xin.x = sx ,xin.y = sy ,xin.now = 0;
int
mk = 0;
for(int
i = 1 ;i <= k ;i ++)
if(
xin.x == K[i].x && xin.y == K[i].y)
{

mk = i;
break;
}
if(
mk) xin.now = 0 | (1 << (mk - 1));
memset(mark ,0 ,sizeof(mark));
q.push(xin);
mark[xin.now][xin.x][xin.y] = 1;
while(!
q.empty())
{

tou = q.front();
q.pop();
if(
tou.now == (1<<k) - 1)
return
mark[tou.now][tou.x][tou.y] - 1;
for(int
i = 0 ;i < 4 ;i ++)
{

xin.x = tou.x + dir[i][0];
xin.y = tou.y + dir[i][1];
xin.now = tou.now;
int
mk = 0;
for(int
j = 1 ;j <= k ;j ++)
if(
xin.x == K[j].x && xin.y == K[j].y)
{

mk = j;
break;
}
if(
mk) xin.now = tou.now | (1<<(mk - 1));
if(
ok(xin.x ,xin.y ,xin.now))
{

mark[xin.now][xin.x][xin.y] = mark[tou.now][tou.x][tou.y] + 1;
q.push(xin);
}
}
}
return -
1;
} int main ()
{
int
i ,j ,sx ,sy;
char
str[N];
while(~
scanf("%d %d" ,&n ,&m) && n + m)
{
for(
i = 1 ;i <= n ;i ++)
{

scanf("%s" ,str);
for(
j = 1 ;j <= m ;j ++)
{
if(
str[j-1] == '@')
map[i][j] = 1 ,sx = i ,sy = j;
if(
str[j-1] == '.') map[i][j] = 1;
if(
str[j-1] == '#') map[i][j] = 0;
}
}

scanf("%d" ,&k);
for(
i = 1 ;i <= k ;i ++)
scanf("%d %d" ,&K[i].x ,&K[i].y);
printf("%d\n" ,BFS(sx ,sy));
}
return
0;
}

hdu4771 水搜索(状态压缩+bfs)的更多相关文章

  1. POJ 2046 Gap 搜索- 状态压缩

    题目地址: http://poj.org/problem?id=2046 一道搜索状态压缩的题目,关键是怎样hash. AC代码: #include <iostream> #include ...

  2. 胜利大逃亡(续)(状态压缩bfs)

    胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  3. 【HDU - 1429】胜利大逃亡(续) (高级搜索)【状态压缩+BFS】

    Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)…… 这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方.刚开 ...

  4. hdu4845 状态压缩BFS

    题意:      给一个n*m的矩阵,从11,走到nm,格子和格子之间可能有墙,也可能有门,有的格子上面有钥匙,相应的钥匙开相应的们,捡钥匙和开门都不需要时间,问你最少多少部能走到nm. 思路:   ...

  5. hdu 3681 Prison Break(状态压缩+bfs)

    Problem Description Rompire . Now it’s time to escape, but Micheal# needs an optimal plan and he con ...

  6. POJ 1753 Flip Game (状态压缩 bfs+位运算)

    Flip game is played on a rectangular 4x4 field with two-sided pieces placed on each of its 16 square ...

  7. HDU 5025 Saving Tang Monk 【状态压缩BFS】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=5025 Saving Tang Monk Time Limit: 2000/1000 MS (Java/O ...

  8. POJ - 1324 Holedox Moving (状态压缩+BFS/A*)

    题目链接 有一个n*m(1<=n,m<=20)的网格图,图中有k堵墙和有一条长度为L(L<=8)的蛇,蛇在移动的过程中不能碰到自己的身体.求蛇移动到点(1,1)所需的最小步数. 显然 ...

  9. POJ 3411 Paid Roads (状态压缩+BFS)

    题意:有n座城市和m(1<=n,m<=10)条路.现在要从城市1到城市n.有些路是要收费的,从a城市到b城市,如果之前到过c城市,那么只要付P的钱, 如果没有去过就付R的钱.求的是最少要花 ...

  10. 「hdu 4845 」拯救大兵瑞恩 [CTSC 1999](状态压缩bfs & 分层图思想)

    首先关于分层图思想详见2004的这个论文 https://wenku.baidu.com/view/dc57f205cc175527072208ad.html 这道题可以用状态压缩,我们对于每一把钥匙 ...

随机推荐

  1. for、while的循环套用和函数的递归

    一.集成开发工具Eclipse 1.1 下载 官网下载 https://www.eclipse.org/downloads/download.php?file=/technology/epp/down ...

  2. Ubuntu的点滴-Vim、VM Tools、Samba、换源

    <div id="article_content" class="article_content clearfix"> <link rel=& ...

  3. C# 应用 - 封装类访问 Postgresql 数据库

    引入库类 连接数据库 访问数据库 1)增删改数据库 2)查数据库 数据转换 事务 1. 引入库类 引入 Npgsql.dll using Npgsql; using NpgsqlTypes; 2. 连 ...

  4. NoSQL安装与操作

    redis操作: redis的启动与关闭:注意:(需要关闭防火墙) redis的启动:redis-server redis.conf redis的登录:redis-cli -a pass redis的 ...

  5. 翻译:《实用的Python编程》05_02_Classes_encapsulation

    目录 | 上一节 (5.1 再谈字典) | 下一节 (6 生成器) 5.2 类和封装 创建类时,通常会尝试将类的内部细节进行封装.本节介绍 Python 编程中有关封装的习惯用法(包括私有变量和私有属 ...

  6. 翻译:《实用的Python编程》06_02_Customizing_iteration

    目录 | 上一节 (6.1 迭代协议) | 下一节 (6.3 生产者/消费者) 6.2 自定义迭代 本节探究如何使用生成器函数自定义迭代. 问题 假设你想要自定义迭代模式. 例如:倒数: >&g ...

  7. (一)SpringBoot启动过程的分析-启动流程概览

    -- 以下内容均基于2.1.8.RELEASE版本 通过粗粒度的分析SpringBoot启动过程中执行的主要操作,可以很容易划分它的大流程,每个流程只关注重要操作为后续深入学习建立一个大纲. 官方示例 ...

  8. OMnet++ 初学者教程 第一节 入门

    第1部分-入门 1.1模型 首先,让我们从一个包含两个节点的"network"开始.节点将做一些简单的事情:一个是节点将创建一个数据包,而两个节点将继续来回传递相同的数据包.我们将 ...

  9. 利用别名切换索引流程Elasticsearch 7.7

    背景 公司里面现在有es集群,由于时间过长,es集群中的某个索引过大但是未删除,一直在写入的情况下,昨天写入突然停止了,发现是索引超时的问题,这时想到通过创建一个新的索引来进行索引切换 操作 es 集 ...

  10. 软工个人阅读作业2 —— 构建之法与CI/CD

    项目 内容 这个作业属于哪个课程 2021春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人阅读作业#2 我在这个课程的目标是 阅读思考教材,调研软工工具 这个作业在哪个具体方面帮助我实 ...