题意:
     给你一个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. hdu4845 状态压缩BFS

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

  2. hdu5094(上海邀请赛E) 状态压缩bfs:取钥匙开门到目的地

    貌似和前段时间的一场网络赛一个类型,状态压缩判断走没走过,然后裸bfs到终点. 其实这类题目很简单就是一个bfs模板,无非就是有一些坑,比如这一题..一个格子可以有多把钥匙汗== 1 #include ...

  3. CodeForces 906C(状态压缩 +BFS)

    题目链接 题意:某人举办了一个party,邀请了他的朋友来,他的朋友也邀请了他们的朋友.etc.然后某人并不认识他朋友的朋友,这样聊天很尬,所以就让邀请他不认识的人的朋友给某人介绍.假设通过朋友C介绍 ...

  4. 【算法练习】动态规划/搜索/状态压缩 百练poj4124:海贼王之伟大航路

    参考链接:https://www.twblogs.net/a/5b8ceaac2b7177188336e93d/zh-cn 题目链接:http://bailian.openjudge.cn/pract ...

  5. noi 7221 拯救公主 (状态压缩+bfs)

    /* 这题实在调糊了 借鉴的题解的一些判断方法 位运算大法好 - - 因为要集齐所有的宝石所以状态压缩一下 f[i][j][s]将s化为二进制 每一0表示该宝石没有 1表示该宝石有 有:到(i,j)这 ...

  6. POJ 1753 Flip Game (黑白棋) (状态压缩+BFS)

    题目大意:有一个4*4的方格,每个方格中放一粒棋子,这个棋子一面是白色,一面是黑色.游戏规则为每次任选16颗中的一颗,把选中的这颗以及它四周的棋子一并反过来,当所有的棋子都是同一个颜色朝上时,游戏就完 ...

  7. SP11469 SUBSET - Balanced Cow Subsets(折半搜索+状态压缩)难度⭐⭐⭐⭐★

    题目链接 SP11469 SUBSET - Balanced Cow Subsets 题目翻译 给出N(1≤N≤20)N(1≤N≤20)N(1≤N≤20)个数M(i)(1<=M(i)<=1 ...

  8. J - 最强王者 POJ - 1753 Flip Game 搜索+状态压缩

    J - 最强王者 POJ - 1753 Flip game is played on a rectangular 4x4 field with two-sided pieces placed on e ...

  9. 【bzoj1195】[HNOI2006]最短母串 AC自动机+状态压缩+BFS最短路

    原文地址:http://www.cnblogs.com/GXZlegend/p/6825226.html 题目描述 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串 ...

最新文章

  1. java Executor实例_Executor框架+实例
  2. TCP/IP详解--第七章
  3. Javascript高级程序设计第二版第四章--变量,作用域及内存问题--笔记
  4. OpenCASCADE:读IGES
  5. Beta 冲刺 (2/7)
  6. LeetCode每日打卡 - 汉明距离
  7. python 命令行解析模块_Python解析命令行读取参数 -- argparse模块
  8. npm收录了哪些包_手把手教你制作一个小而美丽的 npm 包并发布
  9. 负离子程序员的一组未来手绘,酷毙了
  10. autocad.net QQ群:193522571 判断string中是否包含集合中所有的字符串
  11. type=file的未选择任何文件修改_Electron应用易“招黑”,轻松被修改并植入后门...
  12. c++回调函数详解及实现(lambda)
  13. ABP框架实战 1.基础信息维护
  14. 多年来我的创业感悟,穷人与富人的赚钱思维模式丨国仁猫哥
  15. java加载so包,undefined symbol处理方法
  16. 【CSS—美化网页元素】
  17. The road to learning English-Writing
  18. 【资料合集】2018云栖大会•南京峰会回顾合集:PDF下载
  19. 扫码器.java_条码扫描器在Java上的实现
  20. STM32F429IGT6入门(一)

热门文章

  1. UVA 11645 Bits(组合数学)
  2. 如何优化tableView的使用?
  3. 用户通过WEB方式更改AD域帐户密码
  4. JSP中base href=%=basePath%作用
  5. 心得体悟帖---12、志向还是太短浅,目光也是
  6. linux 设置系统时间
  7. 解决:Unknown table engine 'InnoDB'
  8. CSS background属性
  9. Linux1:Linux概述
  10. Hackerrank - The Grid Search