BFS+二进制状态压缩 hdu-1429
好久没写搜索题了,就当练手吧。
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的更多相关文章
- hdu 1429 bfs+二进制状态压缩
开始时候只用了BFS,显然超时啊,必然在结构体里加一个数组什么的判重啊,开始用的一个BOOL数组,显然还是不行,复杂度高,每次都要遍历数组来判重:后百度之,学习了二进制状态压缩,其实就用一个二进制数来 ...
- POJ 2777.Count Color-线段树(区间染色+区间查询颜色数量二进制状态压缩)-若干年之前的一道题目。。。
Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 53312 Accepted: 16050 Des ...
- # 最短Hamilton路径(二进制状态压缩)
最短Hamilton路径(二进制状态压缩) 题目描述:n个点的带权无向图,从0-n-1,求从起点0到终点n-1的最短Hamilton路径(Hamilton路径:从0-n-1不重不漏的每个点恰好进过一次 ...
- HDU 3681 Prison Break(BFS+二分+状态压缩DP)
Problem Description Rompire is a robot kingdom and a lot of robots live there peacefully. But one da ...
- leetcode 864. 获取所有钥匙的最短路径(BFS,状态压缩)
题目链接 864. 获取所有钥匙的最短路径 题意 给定起点,要求在最短步骤内收集完所有钥匙,遇到每把锁之前只有 有对应的钥匙才能够打开 思路 BFS+状态压缩典型题目 先确定起点和总的钥匙数目,其次难 ...
- Fiber Network ZOJ 1967(Floyd+二进制状态压缩)
Description Several startup companies have decided to build a better Internet, called the "Fibe ...
- 二进制状态压缩dp(旅行商TSP)POJ3311
http://poj.org/problem?id=3311 Hie with the Pie Time Limit: 2000MS Memory Limit: 65536K Total Subm ...
- hdu Swipe Bo(bfs+状态压缩)错了多次的题
Swipe Bo Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- POJ-3279.Fliptile(二进制状态压缩 + dfs) 子集生成
昨天晚上12点刷到的这个题,一开始一位是BFS,但是一直没有思路.后来推了一下发现只需要依次枚举第一行的所有翻转状态然后再对每个情况的其它田地翻转进行暴力dfs就可以,但是由于二进制压缩学的不是很透, ...
随机推荐
- topcoder srm 445 div1
problem1 link 这个的结论是只需要考虑坐标是整数或者是整数.5,比如(2.5,3),(4,3.5),(1.5,4.5)这样的时候.这个详细证明起来应该挺麻烦的.这里有一些讨论. probl ...
- cf水题
题意:输入多组数据,有的数据代表硬币的长宽,有的数据代表钱包的长宽,问你当这组数据代表钱包的长宽时,能不能把它前面出现的所有硬币全部装下. 思路:只要钱包的长宽大于前面出现的所有硬币的长宽就可以装下, ...
- Mybatis自增长id处理
目录 1.使用useGenerateKey 2.使用select LAST_INSERT_ID() 3.使用select @@IDENTITY 4.在MySql中模拟Sequence 参考: 1.使用 ...
- 浅谈Java中static关键字、权限修饰符
1.实例变量:也称非静态成员变量,实例变量前没有static关键字,用来描述同一类事物的公共属性.访问方式:对象名.变量名.实例变量存储在堆区,对象有n个,数据就有n个.实例变量随着对象的创建而创建, ...
- Tutorial: Generate BBox or Rectangle to locate the target obejct
Tutorial: Generate BBox or Rectangle to locate the target obejct clc;close all;clear all; Img=imread ...
- 用RAR将多个文件夹一次性压缩为多个对应zip文件
选中要压缩的所有文件夹.右键,选“添加到压缩文件...”,弹出的菜单如下图: 点击菜单栏“文件”.在“把每个文件都单独压缩文件中”选中,才可以单独创建压缩.如下图
- 并发学习一、MPI初步认识
学习参考地址:https://www.jianshu.com/p/2fd31665e816 编程使用的vs2015 社区版本(个人感觉比Vc6.0的丑界面看起来舒服多了) MPI基本函数 MPI调用借 ...
- 【.Net】在windows server 2016 和Windows10这些server上安装.net fw3.5
一般就是打开server manager. 一直next到add feature 讲net3.5勾选 发现需要指定一个路径是什么 source\sxs之类的 下载microsoft-windows-n ...
- 如何快速获取properties中的配置属性值
本文为博主原创,未经博主允许,不得转载: 在项目中,经常需要将一些配置的常量信息放到properties文件中,这样在项目的配置变动的时候,只需要修改配置文件中 对应的配置常量即可. 在项目应用中,如 ...
- 使用p4c将P4 14代码转换为16代码
参考: [Question] How to make conversion between P4 14 and P4 16? 使用p4c将P4 14代码转换为16代码: $ p4test --p4v ...