/*
这题实在调糊了 借鉴的题解的一些判断方法 位运算大法好 - -
因为要集齐所有的宝石所以状态压缩一下
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[210][210][33],sx,sy,ex,ey,num;
int xx[5]={0,0,0,1,-1};
int yy[5]={0,1,-1,0,0};
char s[210][210];
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[15];
bool check(int s)
{int cnt=0;for(int i=0;i<=4;i++)if((s>>i)&1==1)cnt++;return(cnt>=k);
}
int main()
{scanf("%d",&T);while(T--){memset(f,0,sizeof(f));memset(s,0,sizeof(s));num=0;queue<point> q;int falg=0;scanf("%d%d%d",&n,&m,&k);for(int i=1;i<=n;i++)for(int j=1;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,0,0));f[sx][sy][0]=1;//初始状态存在 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=1;//多组数据害死人啊  一开始return 0 了
              }if(falg)break;if(s[nx][ny]=='.')//一般的情况 直接周围的点入队 for(int i=1;i<=4;i++){int ox=nx+xx[i];int oy=ny+yy[i];if(ox>0&&ox<=n&&oy>0&&oy<=m&&f[ox][oy][su]==0&&s[ox][oy]!='#'){f[ox][oy][su]=1;q.push(point(ox,oy,time+1,su));}} if(s[nx][ny]=='$')//传送门 把所有传送门周围的点都入队
              {for(int i=1;i<=num;i++)for(int j=1;j<=4;j++){int ox=door[i].xi+xx[j];int oy=door[i].yi+yy[j];if(ox>0&&ox<=n&&oy>0&&oy<=m&&f[ox][oy][su]==0&&s[ox][oy]!='#'){f[ox][oy][su]=1;q.push(point(ox,oy,time+1,su));}}}if(s[nx][ny]>='0'&&s[nx][ny]<='4')//开始收集宝石了
                {int si=su|(1<< (s[nx][ny]-'0'));//转化出新状态 for(int i=1;i<=4;i++){int ox=nx+xx[i];int oy=ny+yy[i];if(ox>0&&ox<=n&&oy>0&&oy<=m&&f[ox][oy][si]==0&&s[ox][oy]!='#')    {f[ox][oy][si]=1;q.push(point(ox,oy,time+1,si));}}  }}if(!falg)printf("oop!\n");}return 0;
}

转载于:https://www.cnblogs.com/yanlifneg/p/5478865.html

noi 7221 拯救公主 (状态压缩+bfs)相关推荐

  1. hdu5094(上海邀请赛E) 状态压缩bfs:取钥匙开门到目的地

    貌似和前段时间的一场网络赛一个类型,状态压缩判断走没走过,然后裸bfs到终点. 其实这类题目很简单就是一个bfs模板,无非就是有一些坑,比如这一题..一个格子可以有多把钥匙汗== 1 #include ...

  2. hdu4845 状态压缩BFS

    题意:      给一个n*m的矩阵,从11,走到nm,格子和格子之间可能有墙,也可能有门,有的格子上面有钥匙,相应的钥匙开相应的们,捡钥匙和开门都不需要时间,问你最少多少部能走到nm. 思路:   ...

  3. CodeForces 906C(状态压缩 +BFS)

    题目链接 题意:某人举办了一个party,邀请了他的朋友来,他的朋友也邀请了他们的朋友.etc.然后某人并不认识他朋友的朋友,这样聊天很尬,所以就让邀请他不认识的人的朋友给某人介绍.假设通过朋友C介绍 ...

  4. POJ 1753 Flip Game (黑白棋) (状态压缩+BFS)

    题目大意:有一个4*4的方格,每个方格中放一粒棋子,这个棋子一面是白色,一面是黑色.游戏规则为每次任选16颗中的一颗,把选中的这颗以及它四周的棋子一并反过来,当所有的棋子都是同一个颜色朝上时,游戏就完 ...

  5. hdu4771 水搜索(状态压缩+bfs)

    题意:      给你一个n*m的地图,问你从起点出发,吧所有的宝藏都捡完用的最少时间. 思路:k <= 4,水题,直接开一个数组mark[now][x][y];now代表的是当前检宝藏的二进制 ...

  6. 【bzoj1195】[HNOI2006]最短母串 AC自动机+状态压缩+BFS最短路

    原文地址:http://www.cnblogs.com/GXZlegend/p/6825226.html 题目描述 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串 ...

  7. 【HDU - 5094】 Maze (状态压缩+bfs)

    题干: This story happened on the background of Star Trek. Spock, the deputy captain of Starship Enterp ...

  8. LeetCode 1210. 穿过迷宫的最少移动次数(状态压缩BFS)

    文章目录 1. 题目 2. 解题 1. 题目 你还记得那条风靡全球的贪吃蛇吗? 我们在一个 n*n 的网格上构建了新的迷宫地图,蛇的长度为 2,也就是说它会占去两个单元格. 蛇会从左上角((0, 0) ...

  9. 洛谷 P2622 关灯问题II (状态压缩+BFS)

    题目描述 现有n盏灯,以及m个按钮.每个按钮可以同时控制这n盏灯--按下了第i个按钮,对于所有的灯都有一个效果.按下i按钮对于第j盏灯,是下面3中效果之一:如果a[i][j]为1,那么当这盏灯开了的时 ...

最新文章

  1. BizTalk 2006 简单入门示例程序(附源项目文件下载)
  2. pads最新版本是多少_电路EDA软件究竟有多少?
  3. c#一个分页控件的例子
  4. java 8代码 改 java7_Java 8 到 Java 14,改变了哪些你写代码的方式?
  5. wdatepicker不展示秒_十一出游去哪里?苏州人都不一定知道的地方!
  6. Nexus 安装 使用说明
  7. java urlconnection乱码_HttpURLConnection 请求乱码
  8. Windows 2003 + ISA 2006+单网卡×××配置(3)
  9. 树莓派安装frp服务
  10. 光固化3D打印 一
  11. JS 时间格式化 时间戳 日期
  12. WireShark基本使用(7)第 7 章 高级
  13. Gram矩阵简单解释
  14. MvvmLazy Android懒人框架
  15. 使用 Laragon 在 Windows 中快速搭建 Laravel 本地开发环境 (转)
  16. 非常详细的 navigationController 的使用
  17. AU变声功能音频调节
  18. 企业为什么需要B2B订货系统
  19. java制作表白软件手机版下载_表白图片制作软件下载-表白图片制作 安卓版v1.0-PC6安卓网...
  20. 计算机毕业设计Java医院病房管理系统(系统+源码+mysql数据库+Lw文档)

热门文章

  1. web前端研发工程师编程能力成长之路
  2. centos 重启网络服务的方法
  3. 十招轻松搞定社会媒体
  4. delphi之http通讯
  5. @MyBatis主键返回
  6. Goolg Chrome 插件开发--Hello world
  7. 【转】Silverlight 3 Beta 新特性解析(7)- Child Window和Shader Effect篇
  8. 关于dotNet加密工具
  9. Android TV 悬浮球模拟物理按键
  10. C++虚继承内存布局===写得很牛!推荐