noi 7221 拯救公主 (状态压缩+bfs)
/*
这题实在调糊了 借鉴的题解的一些判断方法 位运算大法好 - -
因为要集齐所有的宝石所以状态压缩一下
f[i][j][s]将s化为二进制 每一0表示该宝石没有 1表示该宝石有
有:到(i,j)这个点时 宝石收集状况为s的状态是否存在
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int T,n,m,k,f[][][],sx,sy,ex,ey,num;
int xx[]={,,,,-};
int yy[]={,,-,,};
char s[][];
struct point
{
int mx, my, step, sum;
point (int xx, int yy, int tt, int ss):mx(xx), my(yy), step(tt), sum(ss){};
};
struct door
{
int xi, yi;
}door[];
bool check(int s)
{
int cnt=;
for(int i=;i<=;i++)
if((s>>i)&==)
cnt++;
return(cnt>=k);
}
int main()
{
scanf("%d",&T);
while(T--)
{
memset(f,,sizeof(f));
memset(s,,sizeof(s));
num=;
queue<point> q;
int falg=;
scanf("%d%d%d",&n,&m,&k);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
cin>>s[i][j];
if(s[i][j]=='S')
{
s[i][j]='.';
sx=i;
sy=j;
}
if(s[i][j]=='E')
{
s[i][j]='.';
ex=i;
ey=j;
}
if(s[i][j]=='$')
{
num++;
door[num].xi=i;
door[num].yi=j;
}
}
q.push(point(sx,sy,,));
f[sx][sy][]=;//初始状态存在
while(!q.empty())
{
point tmmp=q.front();
q.pop();
int nx=tmmp.mx;
int ny=tmmp.my;
int su=tmmp.sum;
int time=tmmp.step;
if(nx==ex&&ny==ey&&check(su))//判断是否符合条件了
{
printf("%d\n",tmmp.step);
falg=;//多组数据害死人啊 一开始return 0 了
}
if(falg)break;
if(s[nx][ny]=='.')//一般的情况 直接周围的点入队
for(int i=;i<=;i++)
{
int ox=nx+xx[i];
int oy=ny+yy[i];
if(ox>&&ox<=n&&oy>&&oy<=m&&f[ox][oy][su]==&&s[ox][oy]!='#')
{
f[ox][oy][su]=;
q.push(point(ox,oy,time+,su));
}
}
if(s[nx][ny]=='$')//传送门 把所有传送门周围的点都入队
{
for(int i=;i<=num;i++)
for(int j=;j<=;j++)
{
int ox=door[i].xi+xx[j];
int oy=door[i].yi+yy[j];
if(ox>&&ox<=n&&oy>&&oy<=m&&f[ox][oy][su]==&&s[ox][oy]!='#')
{
f[ox][oy][su]=;
q.push(point(ox,oy,time+,su));
}
}
}
if(s[nx][ny]>=''&&s[nx][ny]<='')//开始收集宝石了
{
int si=su|(<< (s[nx][ny]-''));//转化出新状态
for(int i=;i<=;i++)
{
int ox=nx+xx[i];
int oy=ny+yy[i];
if(ox>&&ox<=n&&oy>&&oy<=m&&f[ox][oy][si]==&&s[ox][oy]!='#')
{
f[ox][oy][si]=;
q.push(point(ox,oy,time+,si));
}
}
}
}
if(!falg)
printf("oop!\n");
}
return ;
}
noi 7221 拯救公主 (状态压缩+bfs)的更多相关文章
- 胜利大逃亡(续)(状态压缩bfs)
胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- 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】
Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)…… 这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方.刚开 ...
- POJ 1753 Flip Game (状态压缩 bfs+位运算)
Flip game is played on a rectangular 4x4 field with two-sided pieces placed on each of its 16 square ...
- HDU 5025 Saving Tang Monk 【状态压缩BFS】
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=5025 Saving Tang Monk Time Limit: 2000/1000 MS (Java/O ...
- POJ - 1324 Holedox Moving (状态压缩+BFS/A*)
题目链接 有一个n*m(1<=n,m<=20)的网格图,图中有k堵墙和有一条长度为L(L<=8)的蛇,蛇在移动的过程中不能碰到自己的身体.求蛇移动到点(1,1)所需的最小步数. 显然 ...
- POJ 3411 Paid Roads (状态压缩+BFS)
题意:有n座城市和m(1<=n,m<=10)条路.现在要从城市1到城市n.有些路是要收费的,从a城市到b城市,如果之前到过c城市,那么只要付P的钱, 如果没有去过就付R的钱.求的是最少要花 ...
- 「hdu 4845 」拯救大兵瑞恩 [CTSC 1999](状态压缩bfs & 分层图思想)
首先关于分层图思想详见2004的这个论文 https://wenku.baidu.com/view/dc57f205cc175527072208ad.html 这道题可以用状态压缩,我们对于每一把钥匙 ...
- [HNOI2006]最短母串问题(AC自动机+状态压缩+bfs)
快要THUSC了,来水几道模板题吧. 这题其实是AC自动机模板.看到长度最短,首先就想到AC自动机.那么就直接暴力法来吧,把每个串建立在AC自动机上,建立fail指针,然后由于n<=12,可以把 ...
随机推荐
- 一个简单的多线程Python爬虫(一)
一个简单的多线程Python爬虫 最近想要抓取拉勾网的数据,最开始是使用Scrapy的,但是遇到了下面两个问题: 前端页面是用JS模板引擎生成的 接口主要是用POST提交参数的 目前不会处理使用JS模 ...
- vim操作命令-笔记
显示行号:在vim命令行模式下输入 :set nu 或 :set number 取消显示行号:在vim命令行模式下输入 :set nonu 或 :set nonumber 查看文件编码格式: :set ...
- windows系统安装ubuntu后,grub中没有windows启动项
我的问题: 安装系统时候,选择grub安装在sdb磁盘 http://forum.ubuntu.org.cn/viewtopic.php?f=139&t=474289&start=15 ...
- Mysql Explain 详解
Mysql Explain 详解[强烈推荐] Mysql Explain 详解一.语法explain < table_name >例如: explain select * from t3 ...
- libcurl的封装,支持同步异步请求,支持多线程下载,支持https
最近在做一个项目,需要用到http get post等 需求分析需要做到同步和异步,异步请求的返回以可选的回调通知的方式进行. 本人以Linux为例,一步一步的来实现. 配置并且编译libcurl我以 ...
- 利用Xilinx中的ROM构造查找表来计算sin和cos的方法探讨
1.使用matlab制作.coe文件 查找表的构造 构造256点的正余弦表 exp(-j*2*pi*(0:255)/256),分别得到 cos和sin的查找表 matlab代码: 求sin fid = ...
- linux中硬盘及网卡的表示方法
Linux中的所有设备均表示为/dev下的一个文件,各种IDE设备分配一个由hd前缀组成的文件:而对于各种SCSI设备,则分配了一个由sd前缀组成的文件,例如: IDE0接口上的主盘成为/dev/hd ...
- 转:PHP 5.4中的traits
原文来自于:http://www.cnblogs.com/thinksasa/archive/2013/05/16/3081247.html PHP 5.4中的traits,是新引入的特性,中文还真不 ...
- hibernate spring 事务配置
<tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx: ...
- Com进程通信(有详细步骤)
http://www.cnblogs.com/FKdelphi/p/5772950.html