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. windows下使用cmd命令杀死进程

    tasklist 使用以上命令显示当前进程,及其PID等,如图所示 找到我要删除的进程的pid(好像有点费劲?) 出现以下提示 原因:没有管理员权限,使用管理员模式打开 在Windows菜单栏中找到命 ...

  2. Spark设置Kryo序列化缓冲区大小

    背景 今天在开发SparkRDD的过程中出现Buffer Overflow错误,查看具体Yarn日志后发现是因为Kryo序列化缓冲区溢出了,日志建议调大spark.kryoserializer.buf ...

  3. redux一些自习时候自己写的的单词

    setState:设置状态 render:渲染,挂载 dispatchEvent : 派发事件 dispatch:分发,派遣:库里的一个方法,简而言之相当于一个actions和reducer监听方法更 ...

  4. 关于Mach-O类型文件那点事

    Mach-O文件简介   Mach-O是一种文件格式,是Mach Object文件格式的缩写. 它通常应用于可执行文件,目标代码,动态库,内核转储等中.   Mach-O作为大部分基于Mach核心的操 ...

  5. Linux之shell编程的基本使用

    1.Shell shell是一个命令行解释器,它为用户提供了一个向 Linux 内核发送请求以便运行程序的系统级程序 2.shell编程打印hello world 2.1 代码部分 #!/bin/ba ...

  6. 安装k8s和NVIDIA环境

    安装环境 系统要求 CPU: 2个核心 内存: 2GB 显卡:NVIDIA系列 安装docker apt install docker.io 安装k8s 添加软件源 方便起见,将Ubuntu的软件管理 ...

  7. async-await 线程分析

    这里没有线程 原文地址:https://blog.stephencleary.com/2013/11/there-is-no-thread.html 前言 我是在看 C#8.0 新特性异步流时在评论里 ...

  8. ForkJoin统计文件夹中包含关键词的数量

    2018-06-09总结: ForkJoin确实可以很快速的去解析文件并统计关键词的数量,但是如果文件过大就会出现内存溢出,是否可以通过虚拟内存方式解决内存溢出的问题呢? package com.ox ...

  9. ORM跨表查询总结

    一.基于对象的查询-->子查询 1.一对多 正向查询:基于 字段 反向查询:基于 表名__set.all() 注意:表名全部小写 2.多对多 正向查询:基于 字段.all() 反向查询:基于 表 ...

  10. 2015年3月26日 - Javascript MVC 框架DerbyJS DerbyJS 是一个 MVC 框架,帮助编写实时,交互的应用。

    2015年3月26日 -  Javascript MVC 框架DerbyJS DerbyJS 是一个 MVC 框架,帮助编写实时,交互的应用.