/*
这题实在调糊了 借鉴的题解的一些判断方法 位运算大法好 - -
因为要集齐所有的宝石所以状态压缩一下
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)的更多相关文章

  1. 胜利大逃亡(续)(状态压缩bfs)

    胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  2. hdu 3681 Prison Break(状态压缩+bfs)

    Problem Description Rompire . Now it’s time to escape, but Micheal# needs an optimal plan and he con ...

  3. 【HDU - 1429】胜利大逃亡(续) (高级搜索)【状态压缩+BFS】

    Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)…… 这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方.刚开 ...

  4. 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 ...

  5. 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 ...

  6. POJ - 1324 Holedox Moving (状态压缩+BFS/A*)

    题目链接 有一个n*m(1<=n,m<=20)的网格图,图中有k堵墙和有一条长度为L(L<=8)的蛇,蛇在移动的过程中不能碰到自己的身体.求蛇移动到点(1,1)所需的最小步数. 显然 ...

  7. POJ 3411 Paid Roads (状态压缩+BFS)

    题意:有n座城市和m(1<=n,m<=10)条路.现在要从城市1到城市n.有些路是要收费的,从a城市到b城市,如果之前到过c城市,那么只要付P的钱, 如果没有去过就付R的钱.求的是最少要花 ...

  8. 「hdu 4845 」拯救大兵瑞恩 [CTSC 1999](状态压缩bfs & 分层图思想)

    首先关于分层图思想详见2004的这个论文 https://wenku.baidu.com/view/dc57f205cc175527072208ad.html 这道题可以用状态压缩,我们对于每一把钥匙 ...

  9. [HNOI2006]最短母串问题(AC自动机+状态压缩+bfs)

    快要THUSC了,来水几道模板题吧. 这题其实是AC自动机模板.看到长度最短,首先就想到AC自动机.那么就直接暴力法来吧,把每个串建立在AC自动机上,建立fail指针,然后由于n<=12,可以把 ...

随机推荐

  1. BAE 环境下 hibernate annotations 配置

     annotations 配置 首先需要加入 hibernate-jpa-2.0-api-1.0.1.Final.jar 和 ejb3-persistence.jar 这两个包 ejb3-persis ...

  2. 将Excel导入到数据中

    常用的方式的有两种: 1. 通过 Microsoft.Jet.OLEDB.4.0 或  Microsoft.ACE.OLEDB.12.0 Microsoft.ACE.OLEDB.12.0 需要安装 A ...

  3. 2. SharePoint Online 开发,请联系qq512800530。加好备注。(不要发站内信。。。)

    ///(不要发站内信...) <meta name="keywords" content="SharePoint Online, SP Online, SPO, S ...

  4. [BZOJ 1875] [SDOI 2009] HH去散步【矩阵乘法】

    题目链接:BZOJ - 1875 题目分析: 这道题如果去掉“不会立刻沿着刚刚走来的路走回”的限制,直接用邻接矩阵跑矩阵乘法就可以了.然而现在加了这个限制,建图的方式就要做一些改变.如果我们把每一条边 ...

  5. KeilC51使用详解 (一)

    第一节 系统概述 Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上.结构性.可读性.可维护性上有明显的优势,因而易学易用.用过 ...

  6. Protues中有源蜂鸣器BUZZER不响的解决办法(有图)

    这个是BUZZER有源蜂鸣器的protues连线图(FM是我自己的电压探针,可以删除的) 下面是我个人设置的蜂鸣器的参数(为什么很多人的这个蜂鸣器不响,是参数没有设置正确) 蜂鸣器不响的原因是 Ope ...

  7. 【转】Android的onCreateOptionsMenu()创建菜单Menu详解

    原文网址:http://www.linuxidc.com/Linux/2012-02/55500.htm Android一共有三种形式的菜单:            1.选项菜单(optinosMen ...

  8. wpa_cli与wpa_supplicant的交互命令

    1)通过adb命令行,可以直接打开supplicant,从而运行wpa_cli,可以解决客户没有显示屏而无法操作WIFI的问题,还可以避免UI的问题带到driver.进一步来说,可以用在很多没有键盘输 ...

  9. UVa1349 Optimal Bus Route Design(二分图最佳完美匹配)

    UVA - 1349 Optimal Bus Route Design Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & ...

  10. linux运维社区站点收集

    1, 新世纪linux社区 offical locator: http://www.21ops.com/industry-news/24370.html 2,