hdu 1429 bfs+二进制状态压缩
开始时候只用了BFS,显然超时啊,必然在结构体里加一个数组什么的判重啊,开始用的一个BOOL数组,显然还是不行,复杂度高,每次都要遍历数组来判重;后百度之,学习了二进制状态压缩,其实就用一个二进制数来表示当前状态,然后就可以用简单快速位运算来操作了。
#include<map>
#include<iostream>
#include<queue>
#include<cstring>
#include<cstdio>
using namespace std;
char a[30][30];
int mark[30][30][1025]; //判重,坐标+钥匙数,二进制表示,每位代表不同钥匙,1有,0无。
int minn=99999;
int f[4][2]={0,1,0,-1,1,0,-1,0};
struct xy
{
int x,y;
int count; // 已经走的步数
int key; // 对应一个二进制数,如0001,在第一位有一把钥匙。
};
void bfs(xy from,int t,int n,int m)
{
queue<xy>q;
q.push(from);
while(!q.empty())
{
xy cur=q.front();
q.pop();
for(int i=0;i<4;i++)
{
xy next(cur);
next.x+=f[i][0];
next.y+=f[i][1];
if(next.x>=0&&next.y>=0&&next.x<n&&next.y<m&&a[next.x][next.y]!='*'&&mark[next.x][next.y][next.key]==0)
{ if(a[next.x][next.y]>='A'&&a[next.x][next.y]<='J')
{
if((next.key&(1<<(a[next.x][next.y]-'A')))==0)continue; //&的优先级比==低!!按位与来判断有无我这把钥匙
}
next.count++;
if(a[next.x][next.y]>='a'&&a[next.x][next.y]<='j')
{
next.key=next.key|(1<<(a[next.x][next.y]-'a')); //按位或来添加这把钥匙。
}
if(next.count==t){return;}
if(a[next.x][next.y]=='^'){minn=next.count;return;}
q.push(next);
mark[next.x][next.y][next.key]=1;
}
}
}
return;
}
int main()
{
int n,m,t;
while(cin>>n>>m>>t)
{
xy from;
minn=99999;
memset(mark,0,sizeof(mark));
from.count=0;
from.key=0;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
cin>>a[i][j];
if(a[i][j]=='@'){from.x=i;from.y=j;}
}
bfs(from,t,n,m);
if(minn==99999)cout<<-1<<endl;
else cout<<minn<<endl;
cout<<endl;
}
}
hdu 1429 bfs+二进制状态压缩的更多相关文章
- BFS+二进制状态压缩 hdu-1429
好久没写搜索题了,就当练手吧. vis[][][1025]第三个维度用来维护不同key持有状态的访问情况. 对于只有钥匙没有对应门的位置,置为'.',避免不必要的状态分支. // // main.cp ...
- hdu 4352 数位dp + 状态压缩
XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU 3001 Travelling(状态压缩DP+三进制)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3001 题目大意:有n个城市,m条路,每条路都有一定的花费,可以从任意城市出发,每个城市不能经过两次以上 ...
- 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 1429(bfs+状态压缩)
题意:容易理解,但要注意的地方是:如果魔王回来的时候刚好走到出口或还未到出口都算逃亡失败.因为这里我贡献了一次wa. 分析:仔细阅读题目之后,会发现最多的钥匙数量为10把,所以把这个作为题目的突破口, ...
- HDU 3681 Prison Break(BFS+二分+状态压缩DP)
Problem Description Rompire is a robot kingdom and a lot of robots live there peacefully. But one da ...
- hdu 3681 Prison Break(状态压缩+bfs)
Problem Description Rompire . Now it’s time to escape, but Micheal# needs an optimal plan and he con ...
- HDU 1429 (BFS+记忆化状压搜索)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1429 题目大意:最短时间内出迷宫,可以走回头路,迷宫内有不同的门,对应不同的钥匙. 解题思路: 要是 ...
随机推荐
- android studio MQTT测试成功
package myself.mqtt.wenzheng.studio.mqtt; import android.app.Notification; import android.app.Notifi ...
- java.lang.NoSuchMethodError: org.hibernate.cfg.Environment.verifyProperties
我在使用jpa2+spring4+hibernate4 的时候,报错java.lang.NoSuchMethodError: org.hibernate.cfg.Environment.verifyP ...
- JavaScript也谈内存优化
相对C/C++ 而言,我们所用的JavaScript 在内存这一方面的处理已经让我们在开发中更注重业务逻辑的编写.但是随着业务的不断复杂化,单页面应用.移动HTML5 应用和Node.js 程序等等的 ...
- Apache的HttpClient的使用
Apache的HttpClient可以被用于从客户端发送HTTP请求到服务器端,其中封装了客户端发送http的get和post请求 使用Apache的HttpClient发送GET和POST请求的步骤 ...
- jquery命名冲突
nodeName是jquery的关键字
- DROP TABLE - 删除一个表
SYNOPSIS DROP TABLE name [, ...] [ CASCADE | RESTRICT ] DESCRIPTION 描述 DROP TABLE 从数据库中删除表或视图. 只有其所有 ...
- 背包DP || Codeforces 544C Writing Code
程序员写bug的故事23333 题意:n个程序员,一共写m行程序,最多产生b个bug,问方案数 思路:f[i][j]表示写了i行,产生了j个bug的方案数,因为每个人都是可以独立的,所以i循环到n都做 ...
- 【转】NIO的定义和原理是什么?
NIO和IO到底有什么区别?有什么关系? 首先说一下核心区别: NIO是以块的方式处理数据,但是IO是以最基础的字节流的形式去写入和读出的.所以在效率上的话,肯定是NIO效率比IO效率会高出很多. N ...
- web中的$多种意思
$符号在php中是表示变量的特征字符, 在js中它也有很多作用, 一般我们用来命名一个函数名称,获取id的1.首先可以用来表示变量, 比如变量 var s='asdsd'或var $s='asdasd ...
- C# 如何正确删除List中的item
参考博客 https://blog.csdn.net/Le_Sam/article/details/75633737 https://www.cnblogs.com/hedianzhan/p/9130 ...