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

bfs,vis[x][y][z],z表示钥匙的状态,用二进制来表示,key[x][y]储存当前位置钥匙的二进制表示。

注意起始点有钥匙的情况。

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std; struct point
{
int x,y,counts,mykey;
}start; int n,m,p,k,s,flag,door[][][][],key[][],vis[][][],dir[][] = {-,,,-,,,,}; int main()
{
while(~scanf("%d%d%d",&n,&m,&p))
{
memset(door,-,sizeof(door));
memset(key,,sizeof(key));
memset(vis,,sizeof(vis));
scanf("%d",&k);
int x1,y1,x2,y2,type;
while(k--)
{
scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&type);
door[x1][y1][x2][y2] = type;
door[x2][y2][x1][y1] = type;
}
scanf("%d",&s);
int x,y,keytype;
while(s--)
{
scanf("%d%d%d",&x,&y,&keytype);
key[x][y] |= <<(keytype-);
}
queue<point> q;
start.x = ;
start.y = ;
start.counts = ;
start.mykey = key[][];
vis[][][start.mykey] = ;
q.push(start);
flag = ;
while(!q.empty())
{ point now = q.front();
q.pop();
if(now.x == n && now.y == m)
{
flag = ;
printf("%d\n",now.counts);
break;
}
for(int i = ;i < ;i++)
{
point temp;
temp.x = now.x+dir[i][];
temp.y = now.y+dir[i][];
if(temp.x < || temp.x > n || temp.y < || temp.y > m) continue;
if(door[now.x][now.y][temp.x][temp.y] != - &&(now.mykey & <<(door[now.x][now.y][temp.x][temp.y]-)) == ) continue;
temp.counts = now.counts+;
temp.mykey = now.mykey | key[temp.x][temp.y];
if(vis[temp.x][temp.y][temp.mykey]) continue;
vis[temp.x][temp.y][temp.mykey] = ;
q.push(temp);
}
}
if(flag) printf("-1\n");
}
}

HDU_5094_dfs的更多相关文章

随机推荐

  1. Java小项目之:五子棋,你下棋下得过电脑吗?

    Java小项目之:五子棋,你下棋下得过电脑吗? Java五子棋功能要求: 1.创建窗口和设计一个棋盘界面 2.实现鼠标点击,棋子出现,黑白棋轮流下 3.能够判断五子相连输赢 4.添加重新开始,悔棋,退 ...

  2. 11 个最佳的 Python 编译器和解释器

    原作:Archie Mistry 翻译:豌豆花下猫@Python猫 原文:https://morioh.com/p/765b19f066a4 Python 是一门对初学者友好的编程语言,是一种多用途的 ...

  3. CF749D Leaving Auction set排序查找

    CodeForces 749D. Leaving Auction 传送门 There are n people taking part in auction today. The rules of a ...

  4. static和final关键字

    static关键字 静态变量 静态变量:又称做类变量,也就是这个变量属于整个类,而不属于单个实例.类所有的实例共享静态变量,可以直接通过类名来访问它.静态变量在内存中只存在一份,当系统第一次加载类时, ...

  5. 有哪些让人相见恨晚的Python库(一)

    对于我这个经常用python倒腾数据的人来说,下面这个库是真·相见恨晚 记得有一次我在服务器上处理数据时,为了解决Pandas读取超过2000W条数据就内存爆炸的问题,整整用了两天时间来优化.最后通过 ...

  6. 关于爬虫的日常复习(14)—— 爬虫beautifulsoup的初级高级的基本用法

  7. 开发者必须要了解的架构技术趋势:Service Mesh

    内容概要 Service Mesh 是干啥的?解决了什么问题? Service Mesh 的特性 Service Mesh 的主流实现有哪些? 1. Service Mesh 是什么? 简单来讲,Se ...

  8. Nmap使用教程(一)

    基本扫描技术 扫描单个网络 nmap 192.168.1.1/www.baidu.com 扫描多个网络/目标 nmap 192.168.1.1 192.168.1.2 #将扫描同个网段内不同的ip地址 ...

  9. if(a)是什么意思

    if(a)等价于 if(a!=0) if(!a)等价于 if(a==0)

  10. 【javaScript】报getElementId()为Null的错误

    若JavaScript代码写在<head>块中,若是javaScript,写JavaScript代码写在里面 window.οnlοad=function(){ js代码内容 } 若是jq ...