7-9The Morning after Halloween uva1601
这题可以用普通bfs来做 也可以用双向bfs来做(先欠着)
有点类似专题训练的一题 不过那题是找钥匙开门 不过都用了状态压缩
题意: n,m(<=16) 的网络上有t(<=3)小写字母 并且网络上有其大写字母 要求最少的步使得所有小写字母到大写字母里面去 每步可以多个小写字母同时移动(上下左右加不动) 移动后任意两个小写字母不能占用同一个位置 也不能在一步之内进行交换位置
且任何一个2*2子网络中至少有一个障碍格
分析: 小写字母最多三个 已经算是少的了 但是有十六乘十六网络 当有三个小写字母的时候 状态总数为 256的三次方 每次状态转移有 5的三次方枚举量 普通bfs肯定是超时的
题目已经暗示了大部分格子都是障碍 因此应该把所有的状态列出来 形成一张图 而不是临时判断五种方案是否合理
过程:先是给所有有效格标号 储存 然后枚举所有的状态 (我现在还是不懂这有什么区别 一个是在main里面判断地图 一个是在bfs里面判断地图 总的枚举量也没有减少?)
然后状态压缩就十分巧妙了 因为格子最多标号为 十六乘十六等于二百五十六 为0xff 为2的八次方 所以左移八位 要得到改状态时右移 取&0xff
还有就是当字母不满三个的时候 加至三个 方便处理 因为状态压缩的相关都是以三个为基准的
看到bfs先判断枚举量 因为这种bfs和我之前做的普通bfs不同 标记数组状态很多 所以要谨慎
#include<bits/stdc++.h>
using namespace std;
#define N 150
int dis[N];
int n,m,t;
char mp[N][N];
int id[N][N];
int x[N];
int y[N];
int s[];
int e[];
int G[N][N];
int vis[N][N][N];
int dx[]={,,,,-};
int dy[]={,,-,,};
bool judge(int x,int x1,int y,int y1)
{
if(x1==y1||(x==y1&&x1==y) )
return ;
return ;
} int id1(int a,int b,int c)
{
return (a<<)|(b<<)|c;
} bool inmap(int x,int y)
{
if(x>=&&x<=n&&y>=&&y<=m)
return ;
return ;
} int bfs()
{
memset(vis,-,sizeof( vis));
queue<int>q;
q.push( id1(s[],s[],s[]) );
vis[s[]][s[] ][s[] ]=; while(!q.empty())
{
int u=q.front();q.pop();
int a = (u>>)&0xff, b = (u>>)&0xff, c = u&0xff;
printf("%d %d %d\n",a,b,c);
if(a==e[]&&b==e[]&&c==e[])return vis[a][b][c];
for(int i=;i<dis[a];i++)
{
int a2=G[a][i];
for(int j=;j<dis[b];j++)
{
int b2=G[b][j];
if(!judge(a,a2,b,b2))continue;
for(int k=;k<dis[c];k++)
{
int c2=G[c][k];
if(!judge(a,a2,c,c2))continue;
if(!judge(b,b2,c,c2))continue;
if(vis[a2][b2][c2]!=-)continue;
vis[a2][b2][c2]=vis[a][b][c]+;
q.push( id1(a2,b2,c2) );
}
}
}
}
return -;
} int main()
{
while(scanf("%d%d%d",&m,&n,&t)&&t)
{
getchar();
for(int i=;i<n;i++)
fgets(mp[i],,stdin); int cnt=;int goal=;
for(int i=;i<n;i++)
for(int j=;j<m;j++)
if(mp[i][j]!='#')
{
id[i][j]=cnt;
x[cnt]=i;y[cnt]=j;
if(islower(mp[i][j])){s[ mp[i][j]-'a' ]=cnt; }
if(isupper(mp[i][j])){e[ mp[i][j]-'A' ]=cnt; }
cnt++;
} printf("%d %d %d\n",s[],s[],s[]);
printf("%d %d %d\n",e[],e[],e[]); for(int i=;i<cnt;i++)
{
dis[i]=;
for(int k=;k<;k++)
{
int nx=x[i]+dx[k];
int ny=y[i]+dy[k];
if(inmap(nx,ny)&&mp[nx][ny]!='#')G[i][dis[i]++ ]=id[nx][ny];
}
}
if(t<=){dis[cnt]=;G[cnt][]=cnt;s[]=e[]=cnt++;}
if(t<=){dis[cnt]=;G[cnt][]=cnt;s[]=e[]=cnt++;}
printf("%d\n",bfs());
}
return ;
}
7-9The Morning after Halloween uva1601的更多相关文章
- The Morning after Halloween uva1601
这道题思路还是比较清晰的,建图加bfs或双向bfs,其实后者比前者少了将近一半的时间.. 建图可以把某一点所拥有邻接点长度(数目)记录在数组0这个位置,因为这道题使用vector会超时. #inclu ...
- UVA1601 The Morning afther Halloween
题目大意 w h (w, h <= 16)的网格有 n ( n <= 3) 个小写字母(代表鬼)其余的是‘#’(代表障碍格) 或 ‘ ’(代表空格. 要求把他们移动到对应的大写字母里.每步 ...
- 【例题 7-9 UVA-1601】The Morning after Halloween
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 对于没有出现的,当成0节点就好. 所以总是认为有3个人需要走到各自的终点. 将平面图转成点边图.这样比较好枚举. (二维变成一维,模 ...
- UVa1601 - The Morning after Halloween [单向bfs]
解题思路: 1.注意到2*2方格中必有一个#,那么最多只有192条通道,可以将所有非‘#’的位置提取出来用邻接表的方式建图,通过bfs搜索目标位置. 2.将三个ghost的位置(a,b,c)作为状态量 ...
- UVa 1601 || POJ 3523 The Morning after Halloween (BFS || 双向BFS && 降维 && 状压)
题意 :w*h(w,h≤16)网格上有n(n≤3)个小写字母(代表鬼).要求把它们分别移动到对应的大写字母里.每步可以有多个鬼同时移动(均为往上下左右4个方向之一移动),但每步结束之后任何两个鬼不能占 ...
- POJ 3370. Halloween treats 抽屉原理 / 鸽巢原理
Halloween treats Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 7644 Accepted: 2798 ...
- Lightoj 题目1422 - Halloween Costumes(区间DP)
1422 - Halloween Costumes PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 ...
- CSUFT 1004 This is Halloween: Saving Money
1004: This is Halloween: Saving Money Time Limit: 1 Sec Memory Limit: 128 MB Submit: 11 So ...
- [POJ 3370] Halloween treats
Halloween treats Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 7143 Accepted: 2641 ...
随机推荐
- Jquery消息提示插件toastr使用
toastr是一个基于jQuery简单.漂亮的消息提示插件,使用简单.方便,可以根据设置的超时时间自动消失. 相关文件到官网去下载即可 1.引入toastr的js和css文件 <link hre ...
- 解题:UOJ #46 玄学
题面 二进制分组,修改把区间拆开丢在后面,合并的时候归并最后两块:查询在对应节点上二分答案 #include<cstdio> #include<cstring> #includ ...
- POJ 1502 MPI Maelstrom / UVA 432 MPI Maelstrom / SCU 1068 MPI Maelstrom / UVALive 5398 MPI Maelstrom /ZOJ 1291 MPI Maelstrom (最短路径)
POJ 1502 MPI Maelstrom / UVA 432 MPI Maelstrom / SCU 1068 MPI Maelstrom / UVALive 5398 MPI Maelstrom ...
- 前端常用功能记录(二)—datatables表格
并不是所有的后台开发都有美工和前端工程师来配合做页面,为了显示数据并有一定的美感,jQuery的DataTables插件对于像我这样的前端菜鸟来说真是雪中送炭,当然对于专业的前端开发者来说它更是锦上添 ...
- 各种蕴含算法思想的DP - 1
study from: https://www.cnblogs.com/flashhu/p/9480669.html 1.前缀和 https://www.luogu.org/problemnew/sh ...
- PowerDesigner 打印错误
PowerDesigner打开pdm文件时报“打印错误”(解决) 原创作品,出自 “深蓝的blog” 博客,欢迎转载,转载时请务必注明出处,否则追究版权法律责任. 深蓝的blog:http://b ...
- 域名、ip、以及通过域名访问网站、虚拟主机
ip 是一个网站的id,是它的地址. 域名是为了解决ip比较难记住才引出的. 利用nginx来配置虚拟主机,通过域名可以访问该网站. 具体实现详见前面文章. 虚拟主机:可以实现在一台服务器虚拟出多个网 ...
- 哈夫曼树;二叉树;二叉排序树(BST)
优先队列:priority_queue<Type, Container, Functional>Type 为数据类型, Container 为保存数据的容器,Functional 为元素比 ...
- (转)flask的context机制
本文转自:https://blog.tonyseek.com/post/the-context-mechanism-of-flask/ 作者:无知的 TonySeek 注意:本文仅仅作为个人mark, ...
- 挂载报错:“/dev/vda1 is apparently in use by the system;”
挂载报错:“/dev/vda1 is apparently in use by the system;” 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 距离回家倒计时还有一天,明天 ...