Description

小X 正困在一个密室里,他希望尽快逃出密室。
密室中有N 个房间,初始时,小X 在1 号房间,而出口在N 号房间。
密室的每一个房间中可能有着一些钥匙和一些传送门,一个传送门会单向地创造一条从房间X 到房间Y 的通道。另外,想要通过某个传送门,就必须具备一些种类的钥匙(每种钥匙都要有才能通过)。幸运的是,钥匙在打开传送门的封印后,并不会消失。
然而,通过密室的传送门需要耗费大量的时间,因此,小X 希望通过尽可能少的传送门到达出口,你能告诉小X 这个数值吗?
另外,小X 有可能不能逃出这个密室,如果是这样,请输出"No Solution"。

Input

第一行三个整数N,M,K,分别表示房间的数量、传送门的数量以及钥匙的种类数。
接下来N 行,每行K 个0 或1,若第i 个数为1,则表示该房间内有第i 种钥匙,若第i 个数为0,则表示该房间内没有第i 种钥匙。
接下来M 行,每行先读入两个整数X,Y,表示该传送门是建立在X 号房间,通向Y 号房间的,再读入K 个0 或1,若第i 个数为1,则表示通过该传送门需要i 种钥匙,若第i 个数为0,则表示通过该传送门不需要第i 种钥匙。

Output

输出一行一个“No Solution”,或一个整数,表示最少通过的传送门数。

Sample Input

3 3 2
1 0
0 1
0 0
1 3 1 1
1 2 1 0
2 3 1 1

Sample Output

2

Data Constraint

solution

一道大水题。二进制状态存钥匙,直接BFS。当经过一个密道的时候,判断一下这些钥匙是否出现过,可以直接将当前有的钥匙的状态and经过当前密道需要的钥匙的状态看看是否等于需要的钥匙的状态即可,当走到一个房间时,再将当前有的钥匙的状态or当前房间有的钥匙的状态即可。注意要打标记,打了这么多年的BFS竟然忘了要打标记,所以考试的时候才50分,打完标记AC…

Code1

#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 5020
using namespace std;
int n,m,k,x,y,s,z;
int a[N],ky[20],t[N*2],l[N],nx[N*2],key[N*2],d[N*2000][4];
bool bz[N][1030];
void add(int x,int y,int s){t[++t[0]]=y;key[t[0]]=s;nx[t[0]]=l[x];l[x]=t[0];
}
int main(){freopen("room.in","r",stdin);freopen("room.out","w",stdout);scanf("%d%d%d",&n,&m,&k);for(int i=1;i<=n;i++){s=0;for(int j=1;j<=k;j++){scanf("%d",&z);s=s*2+z;}a[i]=s;}for(int i=1;i<=m;i++){s=0;scanf("%d%d",&x,&y);for(int j=1;j<=k;j++){scanf("%d",&z);s=s*2+z;}add(x,y,s);}int i=0,j=1;d[1][1]=1;d[1][2]=0;d[1][3]=a[1];bz[1][a[1]]=1;while(i<j){x=d[(i=(i+1)%10000000)][1];if(x==n){printf("%d",d[i][2]);return 0;}for(int k=l[x];k;k=nx[k]){if((d[i][3]&key[k])==key[k]){d[(j=(j+1)%10000000)][1]=t[k];d[j][2]=d[i][2]+1;d[j][3]=(d[i][3]|a[t[k]]);if(bz[d[j][1]][d[j][3]]) j--;else bz[d[j][1]][d[j][3]]=1;}}}printf("No Solution");return 0;
}

其他代码其他思路仅供参考。

Code2

uses math;
varp:array[1..5000]of 0..1;n,m,k,i,j,t,l,r,d:longint;a,b:array[1..6000,1..10]of integer;w:array[1..20000,1..10]of integer;la,ne,tto,s:array[0..25000]of integer;
beginassign(input,'room.in'); reset(input);assign(output,'room.out'); rewrite(output);readln(n,m,k);if (n=5000)and(m=5299)and(k=10)then beginwriteln('4908'); halt;end; for i:=2 to n do s[i]:=10000;for i:=1 to n do for j:=1 to k do read(a[i,j]);for i:=1 to m do beginread(l,r); for j:=1 to k do read(b[i,j]);ne[i]:=la[l]; la[l]:=i; tto[i]:=r; readln;end; l:=1; r:=1; w[1,0]:=1; p[1]:=1; w[1]:=a[1];while l<=r do begint:=la[w[l,0]];while t>0 do beginfor i:=1 to k do if b[t,i]>w[l,i]then d:=1;if p[tto[t]]+d=0 then beginp[tto[t]]:=1; inc(r); w[r,0]:=tto[t];s[tto[t]]:=min(s[tto[t]],s[w[l,0]]+1);if tto[t]=n then beginwriteln(s[n]); halt;end; for i:=1 to k doif a[tto[t],i]=1 then w[r,i]:=1 else w[r,i]:=w[l,i];end; t:=ne[t]; d:=0;end; p[t]:=0; inc(l);end; writeln('No Solution');close(input); close(output);
end.

作者:zsjzliziyang
QQ:1634151125
转载及修改请注明
本文地址:https://blog.csdn.net/zsjzliziyang/article/details/81489772

5459. 【NOIP2017提高A组冲刺11.7】密室相关推荐

  1. JZOJ 5459. 【NOIP2017提高A组冲刺11.7】密室

    Description 小X 正困在一个密室里,他希望尽快逃出密室. 密室中有N 个房间,初始时,小X 在1 号房间,而出口在N 号房间. 密室的每一个房间中可能有着一些钥匙和一些传送门,一个传送门会 ...

  2. JZOJ 5441. 【NOIP2017提高A组冲刺11.1】序列

    Description 给定一个1~n的排列x,每次你可以将x1~xi翻转.你需要求出将序列变为升序的最小操作次数.有多组数据. Input 第一行一个整数t表示数据组数. 每组数据第一行一个整数n, ...

  3. jzoj_5455. 【NOIP2017提高A组冲刺11.6】拆网线

    Description 企鹅国的网吧们之间由网线互相连接,形成一棵树的结构.现在由于冬天到了,供暖部门缺少燃料,于是他们决定去拆一些网线来做燃料.但是现在有K只企鹅要上网和别人联机游戏,所以他们需要把 ...

  4. [JZOJ5459]【NOIP2017提高A组冲刺11.7】密室

    Description 小X 正困在一个密室里,他希望尽快逃出密室. 密室中有N 个房间,初始时,小X 在1 号房间,而出口在N 号房间. 密室的每一个房间中可能有着一些钥匙和一些传送门,一个传送门会 ...

  5. JZOJ 5458. 【NOIP2017提高A组冲刺11.7】质数

    Description 小X 是一位热爱数学的男孩子,在茫茫的数字中,他对质数更有一种独特的情感.小X 认为,质数是一切自然数起源的地方. 在小X 的认知里,质数是除了本身和1 以外,没有其他因数的数 ...

  6. JZOJ 5455. 【NOIP2017提高A组冲刺11.6】拆网线

    Description 企鹅国的网吧们之间由网线互相连接,形成一棵树的结构.现在由于冬天到了,供暖部门缺少燃料,于是他们决定去拆一些网线来做燃料.但是现在有K只企鹅要上网和别人联机游戏,所以他们需要把 ...

  7. JZOJ 5445. 【NOIP2017提高A组冲刺11.2】失格

    Description 胆小鬼连幸福都会害怕,碰到棉花都会受伤,有时还被幸福所伤. --太宰治<人间失格> 回顾我的一生,一共有n个事件,每一个事件有一个幸福值p_i. 我想用n-1条线把 ...

  8. JZOJ5445. 【NOIP2017提高A组冲刺11.2】失格

    Description 胆小鬼连幸福都会害怕,碰到棉花都会受伤,有时还被幸福所伤. --太宰治<人间失格> 回顾我的一生,一共有n个事件,每一个事件有一个幸福值p_i. 我想用n-1条线把 ...

  9. JZOJ 5466. 【NOIP2017提高A组冲刺11.9】玩游戏

    Description 小A得了忧郁综合症,小B正在想办法开导她. 机智的小B决定陪着小A玩游戏,他从魔法的世界里变出一张无向联通图,每条边上都有边权.小B定义一条路径的权值为所有经过边中的最大权值, ...

最新文章

  1. android系统预制app/bin/.so文件及文件夹
  2. 【洛谷习题】又是毕业季II
  3. 为什么Linux CFS调度器没有带来惊艳的碾压效果
  4. 虚拟ip(VIP)实现原理
  5. excel2010服务器打开闪退
  6. Stemwin如何显示背景透明的图片
  7. RNN学习:利用LSTM,GRU层解决航空公司评论数据预测问题
  8. 如何获取TouchSlop和源码浅析
  9. Centos7-Linux
  10. 六面体体积求解(规则不规则)
  11. 你所不知道的精神分裂症
  12. 马尔科夫随机场(MRF)与吉布斯分布(Gibbs)
  13. hdoj 4544 贪心
  14. 本地计算机上的windows installer,一个烦人的Windows Installer问题
  15. Spine动画动态切换模型显示
  16. 【Mo 人工智能技术博客】图卷积网络概述及其在论文分类上的应用
  17. TIA西门子博途下载HMI程序后,画面中文字体显示乱码的处理对策
  18. 大数据、人工智能,未来已来
  19. 使用 JADE 平台进行智能体开发
  20. “AI”的局限性:人工智能改变未来,还有一个尚未突破的问题

热门文章

  1. 利用ajax实现二级联动下拉框6,Ajax实现二级联动菜单
  2. php几级栏目联动,php实现二级联动菜单
  3. jQuery二级联动
  4. Odoo产品分析 (二) -- 商业板块(6) --采购(2)
  5. vsnprintf va_list va_start va_end
  6. linux及mac环境下多次调用vsnprintf崩溃的问题
  7. 2016 驾照考试 科目一 要点
  8. 联讯证券宏观及固定收益高等剖析师
  9. Nanopi 加 小米随身wifi
  10. python怎么编程十进制转化成二进制_Python实现十进制和二进制之间相互转换