The Morning after Halloween uva1601
这道题思路还是比较清晰的,建图加bfs或双向bfs,其实后者比前者少了将近一半的时间。。
建图可以把某一点所拥有邻接点长度(数目)记录在数组0这个位置,因为这道题使用vector会超时。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <map>
using namespace std;
char a[][];
int nex[][]= {,,,,-,,,-};
int book[][],top,book1[];
int w,h,n;
int sta[],ent[];
int mat[][];
inline bool is_inrage(int x,int y)
{
if(x<||x>=h||y<||y>=w) return false;
return true;
}
int findid(int x,int y)
{
if(book[x][y]) return book[x][y];
book[x][y]=++top;
return book[x][y];
}
struct note
{
int status[];
int length;
int step;
note()
{
status[]=status[]=status[]=;
}
};
short vis1[][][],vis2[][][];
bool invilid(int prea,int preb,int nowa,int nowb)
{
if(nowa==nowb||(prea==nowb&&preb==nowa)) return true;
return false;
}
int bfs(int len)
{
memset(vis1,,sizeof(vis1));
memset(vis2,,sizeof(vis2));
queue<note>que1,que2;
note start,ends;
ends.length=start.length=len;
ends.step=start.step=;
for(int i=; i<len; i++)
{
start.status[i]=sta[i];
ends.status[i]=ent[i];
}
que1.push(start);
que2.push(ends);
vis1[start.status[]][start.status[]][start.status[]]=;
vis2[ends.status[]][ends.status[]][ends.status[]]=;
int ac[],flag;
struct note u1,v1,u2,v2;
while(!que1.empty()||!que2.empty())
{
if(!que1.empty())
{
u1=que1.front();
que1.pop();
for(int i=; i<=mat[u1.status[]][]; i++)
{
ac[]=mat[u1.status[]][i];
for(int j=; j<=mat[u1.status[]][]; j++)
{
ac[]=mat[u1.status[]][j];
if(invilid(u1.status[],u1.status[],ac[],ac[])) continue;
for(int h=; h<=mat[u1.status[]][]; h++)
{
ac[]=mat[u1.status[]][h];
if(len==) if(invilid(u1.status[],u1.status[],ac[],ac[])) continue;
if(len==) if(invilid(u1.status[],u1.status[],ac[],ac[])) continue;
v1.step=u1.step+;
v1.length=u1.length;
v1.status[]=ac[];
v1.status[]=ac[];
v1.status[]=ac[];
if(vis1[v1.status[]][v1.status[]][v1.status[]]) continue;
vis1[v1.status[]][v1.status[]][v1.status[]]=v1.step;
que1.push(v1);
int a1,b1,c1;
a1=v1.status[];b1=v1.status[];c1=v1.status[];
if(vis2[a1][b1][c1]) return vis1[a1][b1][c1]+vis2[a1][b1][c1];
}
}
}
}
if(!que2.empty())
{
u2=que2.front();
que2.pop();
for(int i=; i<=mat[u2.status[]][]; i++)
{
ac[]=mat[u2.status[]][i];
for(int j=; j<=mat[u2.status[]][]; j++)
{
ac[]=mat[u2.status[]][j];
if(invilid(u2.status[],u2.status[],ac[],ac[])) continue;
for(int h=; h<=mat[u2.status[]][]; h++)
{
ac[]=mat[u2.status[]][h];
if(len==) if(invilid(u2.status[],u2.status[],ac[],ac[])) continue;
if(len==) if(invilid(u2.status[],u2.status[],ac[],ac[])) continue;
v2.step=u2.step+;
v2.length=u2.length;
v2.status[]=ac[];
v2.status[]=ac[];
v2.status[]=ac[];
if(vis2[v2.status[]][v2.status[]][v2.status[]]) continue;
vis2[v2.status[]][v2.status[]][v2.status[]]=v2.step;
que2.push(v2);
int a2,b2,c2;
a2=v2.status[];b2=v2.status[];c2=v2.status[];
if(vis1[a2][b2][c2]) return vis1[a2][b2][c2]+vis2[a2][b2][c2];
}
}
}
}
}
return -;
}
struct node
{
int x,y;
char v;
node() {}
node(int xx,int yy,char vv):x(xx),y(yy),v(vv) {}
bool operator < (const node &another) const
{
return v<another.v;
}
};
int main()
{
while(scanf("%d%d%d",&w,&h,&n),w+h+n)
{
char ch[];
memset(book,,sizeof(book));
node t1[],t2[];
int s1=,s2=;
memset(mat,,sizeof(mat));
getchar();
for(int i=; i<h; i++)
{
gets(ch);
for(int j=; j<w; j++)
{
a[i][j]=ch[j];
if('a'<=ch[j]&&ch[j]<='z') t1[s1++]=node(i,j,ch[j]);
if('A'<=ch[j]&&ch[j]<='Z') t2[s2++]=node(i,j,ch[j]);
}
}
int nx,ny,idpre,idnex;
top=;
for(int i=; i<h; i++)
{
for(int j=; j<w; j++)
{
for(int k=; k<; k++)
{
if(a[i][j]=='#') continue;
nx=i+nex[k][];
ny=j+nex[k][];
if(is_inrage(nx,ny)&&a[nx][ny]!='#')
{
idpre=findid(i,j);
idnex=findid(nx,ny);
int lenth=++mat[idpre][];
mat[idpre][lenth]=idnex;
}
}
}
}
for(int i=; i<=top; i++)
{
++mat[i][];
mat[i][mat[i][]]=i;
}
sort(t1,t1+n);
sort(t2,t2+n);
for(int i=; i<n; i++)
{
sta[i]=findid(t1[i].x,t1[i].y);
ent[i]=findid(t2[i].x,t2[i].y);
// cout<<sta[i]<<" "<<ent[i]<<endl;
}
printf("%d\n",bfs(n));
}
return ;
}
The Morning after Halloween uva1601的更多相关文章
- 7-9The Morning after Halloween uva1601
这题可以用普通bfs来做 也可以用双向bfs来做(先欠着) 有点类似专题训练的一题 不过那题是找钥匙开门 不过都用了状态压缩 题意: n,m(<=16) 的网络上有t(<=3) ...
- 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 ...
随机推荐
- bzoj1008 [HNOI2008]越狱——快速幂
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1008 (这样一道水题还因为忘记写 %lld WA了那么多遍) 发生越狱的状态数,就是全部状态 ...
- 68. 对Extjs中store的多种操作
转自:https://www.cnblogs.com/exmyth/archive/2013/05/16/3082045.html 先来个声明,看着不错,贴过来的,没都测试过. Store.getCo ...
- MAC地址 初识
MAC地址 即物理地址/硬件地址 地址长度为48位,6字节. 格式为:00-23-5A-15-99-42 一个网卡对应一个MAC地址(比如笔记本,有线网卡有一个MAC地址,无线网卡也有一个MAC地址) ...
- km算法(二分图最大权匹配)学习
啦啦啦! KM算法是通过给每个顶点一个标号(叫做顶标)来把求最大权匹配的问题转 化为求完备匹配的问题的.设顶点Xi的顶标为A[i],顶点Yi的顶标为B[i],顶点Xi与Yj之间的边权为w[i,j].在 ...
- DeadObjectException
开发的过程中有时候会遇到DeadObjectException,说明系统service已经停止运行,解决的方式是在mainfistxml的application标签中添加android:hardwar ...
- AIDL跨进程通信报Intent must be explicit
在Android5.0机子上采用隐式启动来调试AIDL时,会出现Intent must be explicit的错误,原因是5.0的机子不允许使用隐式启动方式,解决的方法是:在启动intent时添加i ...
- iOS CoreData 开发
新年新气象,曾经的妹子结婚了,而光棍的我决定书写博客~ 废话结束. 本人不爱使用第三方的东东,喜欢原汁原味的官方版本,本次带来CoreData数据存储篇~ 创建应用
- React Native真机调试安卓版
React Native真机调试安卓版 一.准备工作 1.1 环境搭建 React Native中文网的文档已经非常清晰地描述了,按照步骤即可.http://reactnative.cn/docs/0 ...
- SQL练习题_用户购买收藏记录合并(拼多多)
目录 拼多多笔试题0805_统计用户数据 笔试题描述 表格构建 数据观察 题目分析 一.合并表格 二.CASE表示(0,1) 三.同理复制FORK表 题目解答 拼多多笔试题0805_统计用户数据 笔试 ...
- PB连接SQLITE
sqlite3数据库,简单而功能强大,比起ini文件保存用户设置,更简单安全,为什么使用数据库存用户设置,由开发者自己去想吧进入话题:pb中可以用ole DB方式在不注册odbc的情况下直接连接数据库 ...