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 ...
随机推荐
- 20170623_oracle_SQL
============SQL分类 数据定义语言(DDL):CREATE ALERT DROP TRUNCATE 数据操纵语言(DML):INSERT UPDATE DELETE SELECT 事务控 ...
- Unix域套接字(Unix Domain Socket)介绍【转】
本文转载自:http://blog.csdn.net/roland_sun/article/details/50266565 版权声明:本文为博主原创文章,未经博主允许不得转载. 在Linux系统中, ...
- JSP-Runoob:JSP 生命周期
ylbtech-JSP-Runoob:JSP 生命周期 1.返回顶部 1. JSP 生命周期 理解JSP底层功能的关键就是去理解它们所遵守的生命周期. JSP生命周期就是从创建到销毁的整个过程,类似于 ...
- Coursera Algorithms week4 基础标签表 练习测验:Inorder traversal with constant extra space
题目原文: Design an algorithm to perform an inorder traversal of a binary search tree using only a const ...
- Linux文件属性相关补充及软硬连接
第1章 文件属性相关 1.1 文件的属性 1.1.1 扩展名 windows 通过扩展名区分不同的类型的文件 linux 扩展名是给人类看的 方便我们区分不同类型文件 .conf 配置文件 ...
- 如何判断js的变量的数据类型
文章首发: http://www.cnblogs.com/sprying/p/4349426.html 本文罗列了一般的Js中类型检测的方法,实际上是每个新手在构建Js知识体系时,都要知晓的,而我只是 ...
- Akka源码分析-Actor发消息(续)
上一篇博客我们分析道mailbox同时也是一个forkjointask,run方法中,调用了processMailbox处理一定数量的消息,然后最终调用dispatcher的registerForEx ...
- 在vue项目npm run build后,index.html中引入css和js 报MIME type问题
问题: 1.在vue项目中,build打包后,index页面打开会报错, MIME type ('text/html') ;报错内容:because its MIME type ('text/html ...
- HTML--form表单中的label标签
小伙伴们,你们在前面学习表单各种控件的时候,有没有发现一个标签--label,这一小节就来揭晓它的作用. label标签不会向用户呈现任何特殊效果,它的作用是为鼠标用户改进了可用性.如果你在 labe ...
- Cookie localStorage sessionStorage
三者的异同 特性 Cookie localStorage sessionStorage 数据的生命期 可设置失效时间,默认是关闭浏览器后失效 除非被清除,否则永久保存 仅在当前会话下(tab标签页)有 ...