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. Shiro权限管理框架(五):自定义Filter实现及其问题排查记录

    明确需求 在使用Shiro的时候,鉴权失败一般都是返回一个错误页或者登录页给前端,特别是后台系统,这种模式用的特别多.但是现在的项目越来越多的趋向于使用前后端分离的方式开发,这时候就需要响应Json数 ...

  2. C++简单项目--推箱子

    在处理移动的时候有太多种情况了: 1.有空位 2.在推箱子,推到了空地 3.推箱子推到了目标, 4.推目标位的箱子推到另一个目标 5.推目标位的箱子推到空地 首先记录目标位置,在每次推动之后会再绘画中 ...

  3. git stash使用

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/daguanjia11/article/ ...

  4. WPF 给Button按钮加小图标图片Image

    前言:当WPF项目后台完成到一定程度的时候,就可以对XAML前端进行美化啦,个人认为XAML前端还是挺有意思的. 下面举一个Button加过小图标后的例子: 是不是比生硬的文字看来更人性化了呢? 不多 ...

  5. 2013 ACM/ICPC Asia Regional Online —— Warmup2 ABEGKL

    HDU4716 A. A Computer Graphics Problem A题目描述 题意:输出手机剩余电量,保证给出的数是10的倍数. 题解:水题,按题意输出即可. 代码: #include & ...

  6. 【JavaScript学习笔记】函数、数组、日期

    一.函数 一个函数应该只返回一种类型的值. 函数中有一个默认的数组变量arguments,存储着传入函数的所有参数. 为了使用函数参数方便,建议给参数起个名字. function fun1(obj, ...

  7. java 字典 map 和 list.forEach

    1.keySet  key 集 2.values value 集(为何不叫valueSet)... 3.entrySet key value 集 List<?> 循环 1.Iterable ...

  8. mongo repository

    using MongoDB.Driver; namespace Dben.Invoice.Repository { /// <summary> /// 仓储基类 /// </summ ...

  9. Spring-cloud微服务实战【一】:微服务的概念与演进过程

    本文是一个系列文章,主要讲述使用spring-cloud进行微服务开发的实战.在开始之前,我们先说一下从传统的单一部署架构到微服务的发展过程,以便让童鞋们更好的理解微服务的概念与演进过程. 1.单体架 ...

  10. 解决a标签点击会出现虚框现象

    1.解决a标签点击会出现虚框现象. 当a标签获得焦点的时候,a标签的周围就会出现虚框,它不同于border,不占任何宽度,a失去焦点的时候就会消失,就是outline. 在遨游,Firefox ,IE ...