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 ...
随机推荐
- Android 体系结构介绍
转自:http://blog.sina.com.cn/s/blog_4bc996c40100fawo.html 第一.操作系统层(OS)第二.各种库(Libraries)和Android 运行环境(R ...
- vue动态绑定class的最常用几种方式
vue动态绑定class的最常用几种方式: 第一种:(最简单的绑定) 1.绑定单个class html部分: <div :class="{'active':isActive}&quo ...
- Django 内容回顾
模板 变量 {{ }} 标签 {% %} if elif else for empty forloop() with...as csrf_token 过滤器 default length add da ...
- JavaScript入门二
******函数****** **函数定义** //普通函数定义 function f1() { console.log("Hello word!") } //带参数的函数 fun ...
- Hadoop基础(一)
Hadoop 基础知识 大数据已经火了很长很长时间了,从最开始是个公司都说自己公司的数据量很大,我们在搞大数据.到现在大数据真的已经非常成熟并且已经在逐渐的影响我们的生产生活.你可能听过支付宝的金融大 ...
- InnoDB锁机制之Gap Lock、Next-Key Lock、Record Lock解析
InnoDB锁机制之Gap Lock.Next-Key Lock.Record Lock解析 有意思,解释的很好
- Educational Codeforces Round 42 (Rated for Div. 2)
A. Equator(模拟) 找权值的中位数,直接模拟.. 代码写的好丑qwq.. #include<cstdio> #include<cstring> #include< ...
- Contact
UF3000: 1.wafer进去prober后,默认probercard不会跟chuck上的wafer接触. 2.通过prober界面上的按钮向上移动,使得prober card和wafer的距离为 ...
- activity间传递参数
传递值对象 值对象可以理解为自定义的数据类型对象. 为了完成这个知识点的讲解,先来创建一个User类型的类,它有name和age两个属性,然后请添加getter/setter方法,构造方法等基本方法. ...
- Angular——数据绑定
基本介绍 angularjs可以实现数据的双向绑定:(1)视图到模型的数据绑定,(2)模型到数据的绑定 基本使用 1.ng-model可以实现视图到模型的数据传输 2.{{name}}可以实现模型到视 ...