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

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. Bootstrap3基础 container 浏览器宽度与容器宽度的四种配合

      内容 参数   OS   Windows 10 x64   browser   Firefox 65.0.2   framework     Bootstrap 3.3.7   editor    ...

  2. Python3 tkinter基础 Label justify 多行字符串左对齐

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  3. RPMB分区介绍【转】

    本文转载自:https://blog.csdn.net/xiezhi123456/article/details/81479793 RPMB(Replay Protected Memory Block ...

  4. codevs1048石子归并

    codevs1048 石子归并  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 传送门  http://codevs.cn/problem/1048/ 题目描述 ...

  5. The Mathematics of the Rubik’s Cube

    https://web.mit.edu/sp.268/www/rubik.pdf Introduction to Group Theory and Permutation Puzzles March ...

  6. [bzoj 4034][HAOI 2015]树上操作

    Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中 ...

  7. P2272 [ZJOI2007]最大半连通子图

    思路 tarjan的题目 注意是要选出一个点集而不是边集 第一问就是缩点之后最长链,第二问就是有多少个最长链,注意缩点后连边要去重(不然一个链的方案可能会被统计多次) 代码 #include < ...

  8. K8S笔记

    K8S 集群结构图 一些名词: etcd etcd保存了整个集群的状态:用于持久化存储集群中所有的资源对象,如Node.Service.Pod.RC.Namespace等:API Server提供了操 ...

  9. ExceptionLogger

    应用1:webconfig.cs中设置 public static class WebApiConfig { public static void Register(HttpConfiguration ...

  10. cmd中utf-8编码的问题

    有时候我们需要使用cmd显示某个utf-8编码的文本,这时候就需要设置cmd的代码页为65100. 也就是 chcp 65001 这条命令.这样设置可以临时生效. 如何要永久生效,需要在注册表中修改. ...