hdu 5025 bfs+状压
http://acm.hdu.edu.cn/showproblem.php?pid=5025
N*N矩阵 M个钥匙
K起点,T终点,S点需多花费1点且只需要一次,1-9表示9把钥匙,只有当前有I号钥匙才能拿I+1号钥匙,可以不拿钥匙只从上面走过
BFS+优先队列。蛇最多只有5条,状压即可。
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <queue>
#include <map>
#include <iostream>
#include <algorithm>
using namespace std;
#define RD(x) scanf("%d",&x)
#define RD2(x,y) scanf("%d%d",&x,&y)
#define clr0(x) memset(x,0,sizeof(x))
typedef long long LL;
typedef pair<int,int> pii;
const int INF = 2000000007;
map <pii,int> hash;
int n,m,sx,sy,tx,ty,cnt_snake;
char s[105][105];
int dx[] = {1,-1,0,0},
dy[] = {0,0,1,-1};
int _key[105][105][10];
int anss;
bool in(int x,int y)
{
return 0 <= x && x < n && 0 <= y && y < n;
}
struct node{
int x,y,key,snak,t;
bool operator < (const node b )const
{
return t > b.t;
}
};
//class cmp
//{
//public:
// cmp(){};
// bool operator ()( const node a, const node b )
// {
// if(a.x!=b.x)
// return a.x<b.x;
// if(a.y!=b.y)
// return a.y<b.y;
// if(a.key != b.key)
// return a.key < b.key;
// if(a.snak != b.snak)
// return a.snak < b.snak;
// return false;
// }
//};
void bfs()
{
//map <node,int,cmp> vis;
priority_queue<node> q;
q.push((node){sx,sy,0,0,0});
while(!q.empty()){
node now = q.top(),to;
int x = now.x,y = now.y,key = now.key,snak = now.snak,t = now.t;
q.pop();
//vis[now] = 0;
if(s[x][y] == 'T' && key == m){//cout<<snak;
anss = min(anss,now.t);
return ;
}
for(int i = 0;i < 4;++i){
int mx = x+dx[i],my = y + dy[i];
if(!in(mx,my) || s[mx][my] == '#')continue;
if(s[mx][my] == 'S'){
pii tt = make_pair(mx,my);
if(snak & (1<<(hash[tt] - 1))){
to = (node){mx,my,key,snak,t+1};
}
else{
int tosnak = snak | (1<<(hash[tt] - 1));
to = (node){mx,my,key,tosnak,t+2};
}
}
else if(s[mx][my] - '0' == key + 1){
to = (node){mx,my,key+1,snak,t+1};
}
else{
to = (node){mx,my,key,snak,t+1};
}
if(to.t < _key[mx][my][to.key]){
q.push(to);
_key[mx][my][to.key] = to.t;
}
}
}
}
int main(){
while(~scanf("%d%d",&n,&m),n|m){
hash.clear();
cnt_snake = 0;
for(int i = 0;i < n;++i){
scanf("%s",s[i]);
for(int j = 0;j < n;++j){
if(s[i][j] == 'K')
sx = i,sy = j;
else if(s[i][j] == 'T')
tx = i,ty = j;
else if(s[i][j] == 'S'){
pii tt = make_pair(i,j);
hash[tt] = ++cnt_snake;
}
for(int k = 0;k <= m;++k)
_key[i][j][k] = INF;
}
}
//int mm = 1<<cnt_snake;
//memset(dp,0x3f,sizeof(dp));
_key[sx][sy][0] = 0;
anss = INF;
bfs();
if(anss >= INF)
puts("impossible");
else
printf("%d\n",anss);
}
return 0;
}
hdu 5025 bfs+状压的更多相关文章
- hdu 2209 bfs+状压
http://acm.hdu.edu.cn/showproblem.php?pid=2209 不知为啥有种直觉.会出状压+搜索的题,刷几道先 简单的BFS.状压表示牌的状态, //#pragma co ...
- hdu 1429 bfs+状压
题意:这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方.刚开始 Ignatius被关在(sx,sy)的位置,离开地牢的门 ...
- HDU 4771 BFS + 状压
Stealing Harry Potter's Precious Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 ...
- C - 小明系列故事――捉迷藏 HDU - 4528 bfs +状压 旅游-- 最短路+状压
C - 小明系列故事――捉迷藏 HDU - 4528 这个题目看了一下题解,感觉没有很难,应该是可以自己敲出来的,感觉自己好蠢... 这个是一个bfs 用bfs就很好写了,首先可以预处理出大明和二明能 ...
- hdu 1044(bfs+状压)
非常经典的一类题型 没有多个出口.这里题目没有说清楚 Collect More Jewels Time Limit: 2000/1000 MS (Java/Others) Memory Limi ...
- HDU 5025 (BFS+记忆化状压搜索)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5025 题目大意: 迷宫中孙悟空救唐僧,可以走回头路.必须收集完钥匙,且必须按顺序收集.迷宫中还有蛇, ...
- hdu 5094 Maze (BFS+状压)
题意: n*m的迷宫.多多要从(1,1)到达(n,m).每移动一步消耗1秒.有P种钥匙. 有K个门或墙.给出K个信息:x1,y1,x2,y2,gi 含义是(x1,y1)与(x2,y2)之间有gi ...
- hdu 4771 Stealing Harry Potter's Precious (BFS+状压)
题意: n*m的迷宫,有一些格能走("."),有一些格不能走("#").起始点为"@". 有K个物体.(K<=4),每个物体都是放在& ...
- 孤岛营救问题 (BFS+状压)
https://loj.ac/problem/6121 BFS + 状压 写过就好想,注意细节debug #include <bits/stdc++.h> #define read rea ...
随机推荐
- DataType 数据类型
基本类型:四类八种:数值 : 整数:byte,short,int,long.默认是 int 小数:float,double 默认是 double 布尔:boolean ...
- hivepython 实现一行转多行
案例1: ==效果等同于一行转多行 数据表名称:zhangb.gid_tags 数据格式,每行是2个字段,(gid,tags) ,可能有脏数据,分隔符为“\t”, ANDROID-9de77225 ...
- stl-stack+括号配对问题
栈:stl的一种容器,遵循先进后出原则,,只能在栈的顶部操作,就像放盘子一样,洗好的盘子叠在上面,需要用时也是先从顶部拿.不允许被遍历,没有迭代器 基本操作: 1.头文件#include<sta ...
- mybatis3 @SelectProvider
mybatis3中增加了使用注解来配置Mapper的新特性,本篇文章主要介绍其中几个@Provider的使用方式,他们是:@SelectProvider.@UpdateProvider.@Insert ...
- vmstat工具
vmstat vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写, 是实时系统监控工具.该命令通过使用knlist子程序和/dev/kmen伪设备驱动器访问这些数 ...
- 记一次spring-session登录后失效的问题
用户登录后,可以进入页面,但ajax请求或跳转其他页面时,会被当做匿名用户,即没有登录.查看session数据库,发现多出两条session,一条为正常数据,里面有对应的用户名:另一条为异常的数据,没 ...
- scrollLeft滚动(用animate替代)
原: let checkedLeft1 = $('#dateBox').find('.checked').position().left let checkedLeft2 = $('#dateBox' ...
- 将tomcat做成服务
①修改startup.bat 在第一行前加入如下内容: SETJAVA_HOME=D:\ProgramFiles\tool\Java\jdk1.6 SETCATALINA_HOME=D:\Progra ...
- JFinal架构简介
JFinal 是基于Java 语言的极速 web 开发框架,其核心设计目标是开发迅速.代码量少.学习简单.功能强大.轻量级.易扩展.Restful.在拥有Java语言所有优势的同时再拥有ruby.py ...
- 【转】HttpHandler的认识与加深理解
原文:http://www.cnblogs.com/whtydn/archive/2009/10/19/1585778.html HttpHandler是HTTP请求的处理中心,真正地对客户端请求的服 ...