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[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)相关推荐
- hdu5094(上海邀请赛E) 状态压缩bfs:取钥匙开门到目的地
貌似和前段时间的一场网络赛一个类型,状态压缩判断走没走过,然后裸bfs到终点. 其实这类题目很简单就是一个bfs模板,无非就是有一些坑,比如这一题..一个格子可以有多把钥匙汗== 1 #include ...
- hdu4845 状态压缩BFS
题意: 给一个n*m的矩阵,从11,走到nm,格子和格子之间可能有墙,也可能有门,有的格子上面有钥匙,相应的钥匙开相应的们,捡钥匙和开门都不需要时间,问你最少多少部能走到nm. 思路: ...
- CodeForces 906C(状态压缩 +BFS)
题目链接 题意:某人举办了一个party,邀请了他的朋友来,他的朋友也邀请了他们的朋友.etc.然后某人并不认识他朋友的朋友,这样聊天很尬,所以就让邀请他不认识的人的朋友给某人介绍.假设通过朋友C介绍 ...
- POJ 1753 Flip Game (黑白棋) (状态压缩+BFS)
题目大意:有一个4*4的方格,每个方格中放一粒棋子,这个棋子一面是白色,一面是黑色.游戏规则为每次任选16颗中的一颗,把选中的这颗以及它四周的棋子一并反过来,当所有的棋子都是同一个颜色朝上时,游戏就完 ...
- hdu4771 水搜索(状态压缩+bfs)
题意: 给你一个n*m的地图,问你从起点出发,吧所有的宝藏都捡完用的最少时间. 思路:k <= 4,水题,直接开一个数组mark[now][x][y];now代表的是当前检宝藏的二进制 ...
- 【bzoj1195】[HNOI2006]最短母串 AC自动机+状态压缩+BFS最短路
原文地址:http://www.cnblogs.com/GXZlegend/p/6825226.html 题目描述 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串 ...
- 【HDU - 5094】 Maze (状态压缩+bfs)
题干: This story happened on the background of Star Trek. Spock, the deputy captain of Starship Enterp ...
- LeetCode 1210. 穿过迷宫的最少移动次数(状态压缩BFS)
文章目录 1. 题目 2. 解题 1. 题目 你还记得那条风靡全球的贪吃蛇吗? 我们在一个 n*n 的网格上构建了新的迷宫地图,蛇的长度为 2,也就是说它会占去两个单元格. 蛇会从左上角((0, 0) ...
- 洛谷 P2622 关灯问题II (状态压缩+BFS)
题目描述 现有n盏灯,以及m个按钮.每个按钮可以同时控制这n盏灯--按下了第i个按钮,对于所有的灯都有一个效果.按下i按钮对于第j盏灯,是下面3中效果之一:如果a[i][j]为1,那么当这盏灯开了的时 ...
最新文章
- BizTalk 2006 简单入门示例程序(附源项目文件下载)
- pads最新版本是多少_电路EDA软件究竟有多少?
- c#一个分页控件的例子
- java 8代码 改 java7_Java 8 到 Java 14,改变了哪些你写代码的方式?
- wdatepicker不展示秒_十一出游去哪里?苏州人都不一定知道的地方!
- Nexus 安装 使用说明
- java urlconnection乱码_HttpURLConnection 请求乱码
- Windows 2003 + ISA 2006+单网卡×××配置(3)
- 树莓派安装frp服务
- 光固化3D打印 一
- JS 时间格式化 时间戳 日期
- WireShark基本使用(7)第 7 章 高级
- Gram矩阵简单解释
- MvvmLazy Android懒人框架
- 使用 Laragon 在 Windows 中快速搭建 Laravel 本地开发环境 (转)
- 非常详细的 navigationController 的使用
- AU变声功能音频调节
- 企业为什么需要B2B订货系统
- java制作表白软件手机版下载_表白图片制作软件下载-表白图片制作 安卓版v1.0-PC6安卓网...
- 计算机毕业设计Java医院病房管理系统(系统+源码+mysql数据库+Lw文档)