貌似和前段时间的一场网络赛一个类型,状态压缩判断走没走过,然后裸bfs到终点。

其实这类题目很简单就是一个bfs模板,无非就是有一些坑,比如这一题。。一个格子可以有多把钥匙汗==

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 #include<queue>
 5 using namespace std;
 6 struct dian{
 7     int x,y,state,time;
 8 };
 9 int n,m;
10 int xx[]={1,-1,0,0};
11 int yy[]={0,0,1,-1};
12 int vis[55][55][1100];
13 int g[55][55][55][55],num[55][55],key[55][55][55];
14 int bfs()
15 {
16     queue<dian>q;
17     dian n1,n2;
18     int i,j,temp,x;
19     while (!q.empty()) q.pop();
20     n1.x=1; n1.y=1; n1.time=0; x=0;
21     for (i=1;i<=num[1][1];i++) x=(x|(1<<key[1][1][i]));
22     n1.state=x; q.push(n1); vis[1][1][n1.state]=1;
23     while (!q.empty())
24     {
25         n1=q.front(); q.pop();
26 //        printf("%d %d %d %d\n",n1.x,n1.y,n1.state,n1.time);
27         if (n1.x==n&&n1.y==m) return n1.time;
28         for (i=0;i<4;i++)
29         {
30             n2.x=n1.x+xx[i]; n2.y=n1.y+yy[i];
31             if (n2.x<=0||n2.x>n||n2.y<=0||n2.y>m) continue;
32             if (g[n1.x][n1.y][n2.x][n2.y]!=-1){
33                 temp=(1<<g[n1.x][n1.y][n2.x][n2.y]);
34                 if ((n1.state&temp)==0) continue;
35             }
36             x=n1.state;
37             for (j=1;j<=num[n2.x][n2.y];j++){
38                     temp=(1<<key[n2.x][n2.y][j]);
39                     x=(x|temp);
40             }
41             n2.state=x;
42             if (vis[n2.x][n2.y][n2.state]) continue;
43             vis[n2.x][n2.y][n2.state]=1;
44             n2.time=n1.time+1;
45             q.push(n2);
46         }
47     }
48     return -1;
49 }
50 int main()
51 {
52     int p,k,i,kind,x1,x2,y1,y2,s;
53     while (~scanf("%d%d%d",&n,&m,&p))
54     {
55         memset(g,-1,sizeof(g));
56         memset(num,0,sizeof(num));
57         memset(vis,0,sizeof(vis));
58         scanf("%d",&k);
59         for (i=1;i<=k;i++)
60         {
61             scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&kind);
62             g[x1][y1][x2][y2]=kind;
63             g[x2][y2][x1][y1]=kind;
64         }
65         scanf("%d",&s);
66         for (i=1;i<=s;i++)
67         {
68             scanf("%d%d%d",&x1,&y1,&kind);
69             num[x1][y1]++;
70             key[x1][y1][num[x1][y1]]=kind;
71         }
72         printf("%d\n",bfs());
73     }
74     return 0;
75 }

View Code

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

转载于:https://www.cnblogs.com/xiao-xin/articles/4069807.html

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

  1. hdu4845 状态压缩BFS

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

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

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

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

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

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

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

  5. hdu4771 水搜索(状态压缩+bfs)

    题意:      给你一个n*m的地图,问你从起点出发,吧所有的宝藏都捡完用的最少时间. 思路:k <= 4,水题,直接开一个数组mark[now][x][y];now代表的是当前检宝藏的二进制 ...

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

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

  7. 【HDU - 5094】 Maze (状态压缩+bfs)

    题干: This story happened on the background of Star Trek. Spock, the deputy captain of Starship Enterp ...

  8. LeetCode 1210. 穿过迷宫的最少移动次数(状态压缩BFS)

    文章目录 1. 题目 2. 解题 1. 题目 你还记得那条风靡全球的贪吃蛇吗? 我们在一个 n*n 的网格上构建了新的迷宫地图,蛇的长度为 2,也就是说它会占去两个单元格. 蛇会从左上角((0, 0) ...

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

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

最新文章

  1. TestCenter中测试需求、测试用例、测试计划的评审方法
  2. ORACLE删除当前用户下所有的表的方法
  3. Java - 用数组求出斐波那契数列的前20项值
  4. 算法高级(36)-如何利用并行提高算法的执行效率?
  5. 视频换脸AISWAP技术示例
  6. Python-进程与线程理论基础-Day10
  7. 三步完美完成wordpress外链跳转
  8. 一个网页如何决定是当前页打开还是新窗口打开?
  9. Java与模式.pdf
  10. windows无法访问指定计算机,windows无法访问指定设备路径或文件的解决方法
  11. ips 测试软件,IPS测试方法.doc
  12. 10个重要的算法C语言实现源代码:拉格朗日,牛顿插值,高斯,龙贝格,牛顿迭代,牛顿-科特斯,雅克比,秦九昭,幂法,高斯塞德尔
  13. 浅析运输管理系统(TMS)
  14. python——人工智能(AI)之网络图片文字识别案例详细讲解
  15. 焊接摆动与不摆动的区别
  16. [CF538H]Summer Dichotomy
  17. FFmpeg音视频倍速控制
  18. 不懂年轻人,还怎么带团队
  19. linux查看vm_type,【心得,备忘录】查看vmlinux的符号信息
  20. 计算机教学在语文中应用,信息技术在语文教学中的运用3篇论文

热门文章

  1. (001) RN开发之Mac搭建开发环境
  2. c语言1a和$20比较大小,[转载]Compare过程(字符的查询与比较)
  3. 用SERVLET进行用户名和密码验证
  4. Spark源码剖析 - SparkContext的初始化(八)_初始化管理器BlockManager
  5. Hadoop(十五)MapReduce程序实例
  6. 【Python算法】哈希存储、哈希表、散列表原理
  7. NetworkManager 冲突
  8. [LeetCode] Remove Element
  9. CSS盒子模型之CSS3可伸缩框属性(Flexible Box)
  10. Android Bitmap转换WebP图片导致损坏的分析及解决方案