题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1885

题目意思:

给一个矩阵,给一个起点多个终点,有些点有墙不能通过,有些点的位置有门,需要拿到相应颜色的钥匙才能打开,问到达终点的最短步数。

解题思路:

BFS+状态压缩。

将每种颜色对应一个二进制数位,1表示已经得到该颜色的钥匙,0表示没有得到。

一把钥匙可以同种颜色的多扇门。

代码:

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#define eps 1e-6
#define INF 0x1f1f1f1f
#define PI acos(-1.0)
#define ll __int64
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;/*
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
*/map<char,int>myp1,myp2;bool vis[20][110][110];
char save[110][110];
int n,m,dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}};struct Point
{int x,y,step,ss;
}s;bool iscan(int x,int y)
{if(x<1||x>n||y<1||y>m||save[x][y]=='#')return false;return true;
}
//一把钥匙可以开颜色相同的多种锁
void bfs()
{memset(vis,false,sizeof(vis));s.step=0,s.ss=0;queue<Point>myq;myq.push(s);vis[0][s.x][s.y]=true;while(!myq.empty()){Point tmp=myq.front();myq.pop();int xx,yy;for(int i=0;i<4;i++){xx=tmp.x+dir[i][0],yy=tmp.y+dir[i][1];if(!iscan(xx,yy))continue;if(save[xx][yy]=='X'){printf("Escape possible in %d steps.\n",tmp.step+1);return ;}int tt=tmp.ss;if(myp1.find(save[xx][yy])!=myp1.end()) //得到一把钥匙{tt=tt|(1<<myp1[save[xx][yy]]);if(vis[tt][xx][yy]) //该状态之前已被访问continue;}else if(myp2.find(save[xx][yy])!=myp2.end()){if(!(tt&(1<<myp2[save[xx][yy]]))) //没有钥匙continue;}if(vis[tt][xx][yy])continue;vis[tt][xx][yy]=true;Point t;t.x=xx,t.y=yy,t.ss=tt,t.step=tmp.step+1;myq.push(t);}}printf("The poor student is trapped!\n");return ;
}int main()
{myp1['b']=0,myp1['y']=1,myp1['r']=2,myp1['g']=3; //每种不同的颜色对应不同的数位myp2['B']=0,myp2['Y']=1,myp2['R']=2,myp2['G']=3;while(scanf("%d%d",&n,&m)&&m+n){memset(vis,false,sizeof(vis));for(int i=1;i<=n;i++){scanf("%s",save[i]+1);for(int j=1;j<=m;j++){if(save[i][j]=='*')s.x=i,s.y=j;}}bfs();}return 0;
}

BFS+状态压缩 hdu-1885-Key Task相关推荐

  1. HDU 1885 Key Task 国家压缩+搜索

    点击打开链接 Key Task Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  2. HDU1429胜利大逃亡(续)HDU 1885 Key Task BFS+状态压缩+水

    HDU1429 只有10把钥匙 1<<10足够了 标记用三维数组 用Linux好不习惯 继续克服- #include <stdio.h> #include <string ...

  3. csu 1536 Bit String Reordering(模拟 bfs+状态压缩)

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1536 题意: 输入n个只为 0或1 的数 形成一个排列 再输入m个数 每个数代表 目标排列 (样例 ...

  4. BFS + 状态压缩总结

    BFS + 状态压缩使用条件 求最短路径时,一般来说会优先考虑使用BFS算法.BFS算法在广度优先搜索的过程中会有一个类似vis的数组去重,避免重复访问 但是在一些情况下,题目需要求最短路径的同时,有 ...

  5. nyist 999 师傅又被妖怪抓走了 【双广搜 || BFS +状态压缩】

    题目:nyist 999 师傅又被妖怪抓走了 分析:在一个图中只要看到D点和E点就行的最小步数,看到的定义是:也就是说两个人在同一行或者同一列,并且中间没有障碍物或者没有其他人就可以看到对方. 所以可 ...

  6. hdu 1429 胜利大逃亡(续) bfs+状态压缩

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

  7. poj 1324(BFS+状态压缩)

    解题思路:这道题一开始的想法就是状态压缩,即考虑如何判重,由于蛇并非是直线的,所以想到了以每一个点的上下左右共四个 值来表示相对位置.最开始想如何用四进制来表示它,无语.....还是题目做少了,直接用 ...

  8. 2021-08-06 leetcode每日一题 BFS+状态压缩,无向图的

    访问所有节点的最短路径 存在一个由 n 个节点组成的无向连通图,图中的节点按从 0 到 n - 1 编号. 给你一个数组 graph 表示这个图.其中,graph[i] 是一个列表,由所有与节点 i ...

  9. bfs+状态压缩dp

    题意:       给你一个地图,问你吧所有的隧道都走完的最小费用,起点不固定,穿越隧道的时间不计,在隧道外边每移动一步花费一秒. 思路:       先bfs求出所有dis[i][j](i的终点和j ...

最新文章

  1. 千言万语汇总的Mybatis-plus常用API全套教程
  2. php写js跳转页面,php实现页面的三种跳转
  3. powerdesigner导出到mysql数据库
  4. 【OpenCV学习】OpenMP并行化实例
  5. mac电脑本地运行MapReduce, Permission denied
  6. 一个 38 岁程序员的中年危机
  7. mysql查询编辑器_navicat怎么进入查询编辑器
  8. PowerApps关于试用环境
  9. html背景音乐自动播放embed,HTML插入背景音乐方法【全】
  10. 用python处理mp4与gif格式互转,简单到爆!
  11. 软件实训之深刻理解原型图设计的核心
  12. 一文让你知道测试职业到底有哪些发展方向
  13. 在Unity中实现GPS定位
  14. inline-bock间隙问题
  15. Matlab笔记(台大郭彦甫14课)
  16. 数字IC-1.10 手撕代码之整数乘法和二范数(Verilog HDL数字加减法练习好帮手)
  17. 黑马程序员—C#多线程
  18. 2019年中国大数据BI(商业智能)行业预测报告
  19. python3__深度学习__受限玻尔兹曼机
  20. 第三人称的英语作文我和我的计算机,英语作文:我的同学My Classmate

热门文章

  1. java数组解析_Java - 数组解析
  2. MFC下绘制曲线工具Teechart使用
  3. java8 接口调用默认方法_Java8接口里的默认方法特性
  4. C语言isalnum函数举例,C语言中的isalnum()函数
  5. 升序排列python_Python3基础 sort 将一个列表中的值升序排列
  6. Python 三维可视化笔记1 -- TVTK库
  7. 出席全球数字经济大会 第四范式助力打造中国数字经济“北京样板”
  8. C指针原理(30)-C语言-LINUX/UNIX环境下调试
  9. 【机器学习】机器学习神器Scikit-Learn保姆级入门教程
  10. 【深度学习】SETR:基于视觉 Transformer 的语义分割模型