好久没写搜索题了,就当练手吧。

vis[][][1025]第三个维度用来维护不同key持有状态的访问情况。

对于只有钥匙没有对应门的位置,置为'.',避免不必要的状态分支。

//
// main.cpp
// hdu_1429
//
// Created by Luke on 16/10/8.
// Copyright © 2016年 Luke. All rights reserved.
// #include <iostream>
#include <string>
#include <cstring>
#include <queue>
using namespace std;
int n,m,t;
int ex,ey;
char Map[][];
int bit[];
struct Node
{
int y,x;
int key;
int step;
};
bool vis[][][];
int dir[][]={,,-,,,,,-};
bool ok(Node &te)
{
if(te.step>=t)
return false;
if(te.y<||te.y>=n||te.x<||te.x>=m)
return false;
if(vis[te.y][te.x][te.key])
return false;
if(Map[te.y][te.x]=='*')
return false;
if(Map[te.y][te.x]>='A'&&Map[te.y][te.x]<='J')
{
int fix=bit[Map[te.y][te.x]-'A'];
if(!(fix&te.key))
return false;
}
if(Map[te.y][te.x]>='a'&&Map[te.y][te.x]<='j')
te.key|=bit[Map[te.y][te.x]-'a'];
vis[te.y][te.x][te.key]=;
return true;
}
int bfs(int sy,int sx)
{
queue<Node> q;
q.push((Node){sy,sx,,});
memset(vis,,sizeof(vis));
Node now,nx;
while(!q.empty())
{
now=q.front(),q.pop();
if(now.y==ey&&now.x==ex)
return now.step;
for(int i=;i<;i++)
{
nx=now;
nx.y+=dir[i][],nx.x+=dir[i][];
nx.step++;
if(ok(nx))
q.push(nx);
}
}
return -;
}
int main(int argc, const char * argv[]) {
cin.sync_with_stdio(false);
bit[]=;
for(int i=;i<;i++)
bit[i]=bit[i-]<<;
while(cin>>n>>m>>t)
{
int sx,sy;
bool fix[];
memset(fix,,sizeof(fix));
for(int i=;i<n;i++)
for(int j=;j<m;j++)
{
cin>>Map[i][j];
if(Map[i][j]>='A'&&Map[i][j]<='J')
fix[Map[i][j]-'A']=;
if(Map[i][j]=='^')
ex=j,ey=i;
if(Map[i][j]=='@')
sx=j,sy=i;
}
for(int i=;i<n;i++)
for(int j=;j<m;j++)
if(Map[i][j]>='a'&&Map[i][j]<='j')
if(!fix[Map[i][j]-'a'])
Map[i][j]='.';
cout<<bfs(sy,sx)<<endl;
}
return ;
}

BFS+二进制状态压缩 hdu-1429的更多相关文章

  1. hdu 1429 bfs+二进制状态压缩

    开始时候只用了BFS,显然超时啊,必然在结构体里加一个数组什么的判重啊,开始用的一个BOOL数组,显然还是不行,复杂度高,每次都要遍历数组来判重:后百度之,学习了二进制状态压缩,其实就用一个二进制数来 ...

  2. POJ 2777.Count Color-线段树(区间染色+区间查询颜色数量二进制状态压缩)-若干年之前的一道题目。。。

    Count Color Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 53312   Accepted: 16050 Des ...

  3. # 最短Hamilton路径(二进制状态压缩)

    最短Hamilton路径(二进制状态压缩) 题目描述:n个点的带权无向图,从0-n-1,求从起点0到终点n-1的最短Hamilton路径(Hamilton路径:从0-n-1不重不漏的每个点恰好进过一次 ...

  4. HDU 3681 Prison Break(BFS+二分+状态压缩DP)

    Problem Description Rompire is a robot kingdom and a lot of robots live there peacefully. But one da ...

  5. leetcode 864. 获取所有钥匙的最短路径(BFS,状态压缩)

    题目链接 864. 获取所有钥匙的最短路径 题意 给定起点,要求在最短步骤内收集完所有钥匙,遇到每把锁之前只有 有对应的钥匙才能够打开 思路 BFS+状态压缩典型题目 先确定起点和总的钥匙数目,其次难 ...

  6. Fiber Network ZOJ 1967(Floyd+二进制状态压缩)

    Description Several startup companies have decided to build a better Internet, called the "Fibe ...

  7. 二进制状态压缩dp(旅行商TSP)POJ3311

    http://poj.org/problem?id=3311 Hie with the Pie Time Limit: 2000MS   Memory Limit: 65536K Total Subm ...

  8. hdu Swipe Bo(bfs+状态压缩)错了多次的题

    Swipe Bo Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  9. POJ-3279.Fliptile(二进制状态压缩 + dfs) 子集生成

    昨天晚上12点刷到的这个题,一开始一位是BFS,但是一直没有思路.后来推了一下发现只需要依次枚举第一行的所有翻转状态然后再对每个情况的其它田地翻转进行暴力dfs就可以,但是由于二进制压缩学的不是很透, ...

随机推荐

  1. Oracle常用函数——TO_DATE

    TO_DATE 含义:将具有固定格式的字符串类型的数据转化为相对应的Date类型数据,官网解释如下图   使用方法 TO_DATE("需要转换的字符串","日期格式&qu ...

  2. vim插件的安装方式 -- vim注释插件和doxygen函数注释生成插件-ctrlp插件-tabular等号对齐 插件

    使用unzip的时候 指定 -d选项, 是说明解压到的 目标地址. 这个参数还是比较方便的, 比直接unzip到当前目录, 然后在去拷贝到目标目录, 然后再删除当前目录中的解压文件夹, 方便多了. 使 ...

  3. Docker 配置阿里云镜像加速器

    由于国内访问直接访问docker hub网速比较慢,拉取镜像的时间就会比较长.一般我们会使用镜像加速或者直接从国内的一些平台镜像仓库上拉取. 根据网上提供的方案,有网易,daocloud,ustc等解 ...

  4. 关于 RabbitMQ 的 Dead-Letters-Queue “死信队列”

      来自一个队列的消息可以被当做‘死信’,即被重新发布到另外一个“exchange”去,这样的情况有: 消息被拒绝 (basic.reject or basic.nack) 且带 requeue=fa ...

  5. 如何卸载旧版本的dotnet core

    How to remove the .NET Core Runtime and SDK https://docs.microsoft.com/en-us/dotnet/core/versions/re ...

  6. Java日期时间(Date/Time)

    获取当前日期和时间 在Java中容易得到当前的日期和时间.可以使用一个简单的Date对象的toString()方法,如下所示打印当前日期和时间: import java.util.Date; publ ...

  7. 使用vue做表单验证

    <template> <Form ref="formInline" :model="formInline" :rules="rule ...

  8. 说明Heap与stack的差别。

    Heap 是堆,Stack 是栈. 栈与堆都是Java用来在Ram中存放数据的地方,与C++不同,Java会自动管理栈与堆,程序员不能直接设置栈与堆. Java的堆是一个运行时的数据区,类的对象从中分 ...

  9. 【五】php 面向对象

    面向对象 概念:按类进行分类,类是表示彼此之间可能互不相同,但是具有一些共同点的对象集合 多态性:不同的类对同一操作可以有不同的行为 继承:允许我们使用子类在类之间创建层次关系 类 关键字:class ...

  10. SpringBoot学习路线

    网上也有很多github资源,都是自己学习Spring Boot时候,自己练的代码 虽然现在最新的版本用2.1.3.RELEASE版本,以前版本的demo运行可能会遇到错误.但是有总比没有要好,不是么 ...