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,可以把 ...
随机推荐
- const 笔记
.指向const的指针例如:double a=1.01;const double * b=&a;*b=2.1; //这显然是错误的a=2.1; //这是正确的,a和*b的值都会变成2.01,有 ...
- shell命令记录一些
ps aux | sort -k 5n|tail -5 找到内存最对的进程 ps aux 是找出全部的进程 sort -k 5n 表示第5个参数进行排序 tail -5 表示最后5个 ps -e - ...
- HAPROXY实习
没事玩玩,简单搞定. 同一个URL可以分发到后端不同的WEB上. STATS页画也刷出来了. 参考网址: http://www.cnblogs.com/kgdxpr/p/3272861.html 如果 ...
- Cognos请求流程——<转>
访问Cognos8 匿名访问 用户通过浏览器发起Cognos访问请求,请求被送至Cognos Gateway Gateway接收请求并发送给一个dispatcher dispatcher发现请求没有附 ...
- C++ Primer 随笔 Chapter 9 顺序容器
参考:http://www.cnblogs.com/kurtwang/archive/2010/08/19/1802912.html 1..顺序容器:vector(快速随机访问):list(快速插入 ...
- bzoj3744
这道题是目前我做bzoj最感动的一题没有之一……首先先警示一下,分块的题目能不套主席树尽量不套因为主席树不仅回答来一个log而且常数也比较大,对于分块这种根号的算法非常不适合这里是求区间逆序对,考虑查 ...
- (转载)提高mysql插入数据的速度
(转载)http://blog.csdn.net/bhq2010/article/details/7376352 需要在mysql中插入2000万条记录,用insert语句插入速度很有限,每秒钟几百条 ...
- 图论(网络流):[SCOI2015]小凸玩矩阵
Description 小凸和小方是好朋友,小方给小凸一个N*M(N<=M)的矩阵A,要求小秃从其中选出N个数,其中任意两个数字不能在同一行或同一列,现小凸想知道选出来的N个数中第K大的数字的最 ...
- 连接Oracle的几种方式
如何引用Data.OracleClient.dll 由于从.net 4.0之后,微软将OracleClient.dll从框架里去除了,所以要使用,需要在VS2010里面去把项目的.net框架从.net ...
- Java---网络编程(2)-UDP
UDP ☆ UDP 将数据及源和目的封装成数据包中,不需要建立连接 每个数据报的大小在限制在64k内 因无连接,是不可靠协议 不需要建立连接,速度快 DatagramSocket和DatagramPa ...