题意:

     给你一个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. 001 说说Python中的深拷贝和浅拷贝

    在Python编程中忽略深拷贝和浅拷贝可能会造成未知的风险. 比如我们打算保存一份原始对象的副本作为上一状态的记录,此后修改原始对象数据时,若是副本对象的数据也发生改变,那么这就是一个严重的错误. 注 ...

  2. 微信小程序和H5之间相互跳转

    1.微信小程序跳转小程序 wx.navigateToMiniProgram <script src='https://res.wx.qq.com/open/js/jweixin-1.3.0.js ...

  3. mysql启动报错1067进程意外终止

    查找了网上的很多种方法都没用,最终找到了我的mysql的安装路径,删除了my.ini配置文件,再重新启动就成功了!

  4. Python3.x 基础练习题100例(81-90)

    练习81: 题目: 809??=800??+9?? 其中??代表的两位数, 809??为四位数,8??的结果为两位数,9??的结果为3位数.求??代表的两位数,及809*??后的结果. 程序: a = ...

  5. there is nothing(i春秋CTF题解)

      (1)打开页面,显示为:there is nothing (2)抓包发现提示 (3)hint:ip,Large internal network 意为最大的内网网段IP,hint: ip,Larg ...

  6. c/s应用程序自动更新组件GeneralUpdate3.2.1发布

    一.组件简介 GeneralUpdate是基于.net standard 开发的一款(c/s应用)自动升级程序.该组件将更新的核心部分抽离出来方便应用于多种项目当中目前适用于wpf,控制台应用,win ...

  7. Android Studio 上传本地项目到 GitHub 上

    •准备工作 注册 GitHub 账号 [GitHub官网] [视频教程] 安装 Git [官方链接] [极速下载链接] 创建本地代码仓库 在桌面上,鼠标右击,选择  Git Bash Here : 接 ...

  8. 前端 | JS Promise:axios 请求结果后面的 .then() 是什么意思?

    Promise 是JS中一种处理异步操作的机制,在现在的前端代码中使用频率很高.Promise 这个词可能有点眼生,但你肯定见过 axios.get(...).then(res => {...} ...

  9. Kubernetes使用metric-server让HPA弹性伸缩运行

    监控架构概述 kubernetes监控指标大体可以分为两类:核心监控指标和自定义指标,核心监控指标是kubernetes内置稳定可靠监控指标,早期由heapster完成,现由metric-server ...

  10. java面试-谈谈你对volatile的理解

    一.volatile特性: volatile是Java虚拟机提供的轻量级的同步机制.主要有三大特性: 保证可见性 不保证原子性 禁止指令重排序 1.保证可见性 1)代码演示 AAA线程修改变量numb ...