题目链接:点击查看

题目大意:给出一个n*m的迷宫,其中有一些边为不可逾越的墙,有一些边为不同型号的门,而钥匙会分布在迷宫的不同位置,求从点(1,1)到点(n,m)的最短时间

题目分析:出现在网络流里的一道题目。。但是一道很裸的bfs+状压,因为不同门的类型给的特别少,只有10种,如果bfs的话时间复杂度也才n*m*2^10,直接搜索就好了

注意一下几个坑点:

  1. 钥匙是永久性的而不是一次性的
  2. 一个点可以有多把钥匙
  3. 起点也可以有钥匙

然后就是简单的bfs了

代码:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=15;const int b[4][2]={0,1,0,-1,1,0,-1,0};int n,m;int maze[N][N][N][N];//maze[x1][y1][x2][y2]之间是否有墙/门int key[N][N];//key[x][y]有哪些钥匙 bool vis[N][N][(1<<N)];//标记状态struct Node
{int x,y,step,state;Node(int X,int Y,int STEP,int STATE){x=X;y=Y;step=STEP;state=STATE;}
};int bfs()
{memset(vis,false,sizeof(vis));queue<Node>q;q.push(Node(1,1,0,key[1][1]));vis[1][1][key[1][1]]=true;while(q.size()){Node cur=q.front();q.pop();if(cur.x==n&&cur.y==m)return cur.step;for(int i=0;i<4;i++){int xx=cur.x+b[i][0];int yy=cur.y+b[i][1];if(xx<=0||yy<=0||xx>n||yy>m)continue;int door=maze[cur.x][cur.y][xx][yy];if(door==-1)//墙 continue;if(door&&!(cur.state&(1<<door)))//没钥匙 continue;if(vis[xx][yy][cur.state|key[xx][yy]])continue;vis[xx][yy][cur.state|key[xx][yy]]=true;q.push(Node(xx,yy,cur.step+1,cur.state|key[xx][yy]));}}return -1;
}int main()
{
//  freopen("input.txt","r",stdin);
//  ios::sync_with_stdio(false);int p;scanf("%d%d%d",&n,&m,&p);int k;scanf("%d",&k);while(k--){int x1,x2,y1,y2,g;scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&g);if(g)//门 maze[x1][y1][x2][y2]=maze[x2][y2][x1][y1]=g;else//墙 maze[x1][y1][x2][y2]=maze[x2][y2][x1][y1]=-1;}scanf("%d",&k);while(k--){int x,y,g;scanf("%d%d%d",&x,&y,&g);key[x][y]|=(1<<g);}printf("%d\n",bfs());return 0;
}

洛谷 - P4011 孤岛营救问题(bfs+状态压缩)相关推荐

  1. 洛谷 P4011 孤岛营救问题【最短路+分层图】

    题外话:昨夜脑子昏沉,今早一调试就过了...错误有:我忘记还有墙直接穿墙过...memset初始化INF用错了数...然后手残敲错一个状态一直过不了样例...要是这状态去比赛我简直完了......or ...

  2. 洛谷 P2622 关灯问题II (状态压缩+BFS)

    题目描述 现有n盏灯,以及m个按钮.每个按钮可以同时控制这n盏灯--按下了第i个按钮,对于所有的灯都有一个效果.按下i按钮对于第j盏灯,是下面3中效果之一:如果a[i][j]为1,那么当这盏灯开了的时 ...

  3. P4011 孤岛营救问题

    P4011 孤岛营救问题 文章目录 输入输出样例 题意: 题解: 代码: 输入输出样例 输入 4 4 9 9 1 2 1 3 2 1 2 2 2 0 2 1 2 2 0 2 1 3 1 0 2 3 3 ...

  4. BFS+状态压缩 hdu-1885-Key Task

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1885 题目意思: 给一个矩阵,给一个起点多个终点,有些点有墙不能通过,有些点的位置有门,需要拿到相应 ...

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

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

  6. BFS + 状态压缩总结

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

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

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

  8. 洛谷 1144 最短路计数 bfs

    洛谷1144 最短路计数 传送门 其实这道题目的正解应该是spfa里面加一些处理,,然而,,然而,,既然它是无权图,,那么就直接bfs了,用一个cnt记录一下每一个点的方案数,分几种情况讨论一下转移, ...

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

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

最新文章

  1. Wiki系统分析比较
  2. php打开并填充表单,php – 创建一个’机器人’来填充带有一些页面的表单
  3. boost::callable_traits添加const成员的测试程序
  4. python @classmethod 和 @staticmethod区别,以及类中方法参数cls和self的区别
  5. java quot;1quot;==quot;1quot;_JAVA: 为什么要使用quot;抽象类quot;? 使用quot;抽象类quot;有什么好处?...
  6. 为什么学好计算机就必须学好汇编?
  7. 一个简洁的个人导航页面源码
  8. spring zipkin mysql_springboot + zipkin + mysql
  9. seam中格式化文本的处理
  10. Partition List,拆分链表
  11. 缓存热点问题解决方案
  12. 【李宏毅机器学习】04:梯度下降Gradient Descent
  13. 【教程】安卓7.0-11.0高版本 fiddler抓包失败的解决方案
  14. 2021年年4月证券从业资格考试《金融市场基础知识》真题(考生回忆 版)
  15. nvm for Mac 安装及使用教程
  16. python的struck.pack的用法:浮点转字节
  17. Attention Points
  18. JavaScript判断浏览器版本
  19. 穆利堂[推荐] WxPM信息化整体解决方案-河南郑州房地产工程项目管理系统软件 穆穆-movno1
  20. Win10 1903过TP的双机调试

热门文章

  1. php恶意代码,php快速查找数据库中恶意代码的方法,快速查找恶意代码_PHP教程...
  2. Ribbon-负载均衡原理
  3. Nginx的rewrite内容介绍
  4. Pod详解-资源配额
  5. Zookeeper基于Java访问-权限
  6. 如何保证消息消费顺序呢?
  7. 字符串转换成ascii码
  8. SpringMVC异常处理之分析和搭建环境
  9. Java中头指针和头结点_. 2 . 【严题集 2.1① 描述以下三个概念的区别:头指针、头结点、首元结点(第一个元素结点)。...
  10. MySQL出现慢日志超过2秒_MySQL慢日志功能分析及优化增强