这道题思路还是比较清晰的,建图加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的更多相关文章

  1. 7-9The Morning after Halloween uva1601

    这题可以用普通bfs来做  也可以用双向bfs来做(先欠着) 有点类似专题训练的一题   不过那题是找钥匙开门   不过都用了状态压缩 题意:  n,m(<=16) 的网络上有t(<=3) ...

  2. UVA1601 The Morning afther Halloween

    题目大意 w h (w, h <= 16)的网格有 n ( n <= 3) 个小写字母(代表鬼)其余的是‘#’(代表障碍格) 或 ‘ ’(代表空格. 要求把他们移动到对应的大写字母里.每步 ...

  3. 【例题 7-9 UVA-1601】The Morning after Halloween

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 对于没有出现的,当成0节点就好. 所以总是认为有3个人需要走到各自的终点. 将平面图转成点边图.这样比较好枚举. (二维变成一维,模 ...

  4. UVa1601 - The Morning after Halloween [单向bfs]

    解题思路: 1.注意到2*2方格中必有一个#,那么最多只有192条通道,可以将所有非‘#’的位置提取出来用邻接表的方式建图,通过bfs搜索目标位置. 2.将三个ghost的位置(a,b,c)作为状态量 ...

  5. UVa 1601 || POJ 3523 The Morning after Halloween (BFS || 双向BFS && 降维 && 状压)

    题意 :w*h(w,h≤16)网格上有n(n≤3)个小写字母(代表鬼).要求把它们分别移动到对应的大写字母里.每步可以有多个鬼同时移动(均为往上下左右4个方向之一移动),但每步结束之后任何两个鬼不能占 ...

  6. POJ 3370. Halloween treats 抽屉原理 / 鸽巢原理

    Halloween treats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7644   Accepted: 2798 ...

  7. Lightoj 题目1422 - Halloween Costumes(区间DP)

    1422 - Halloween Costumes   PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 ...

  8. CSUFT 1004 This is Halloween: Saving Money

    1004: This is Halloween: Saving Money Time Limit: 1 Sec      Memory Limit: 128 MB Submit: 11      So ...

  9. [POJ 3370] Halloween treats

    Halloween treats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7143   Accepted: 2641 ...

随机推荐

  1. ASP.NET Overview

    https://msdn.microsoft.com/en-us/library/4w3ex9c2.aspx ASP.NET is a unified统一的 Web development model ...

  2. [置顶] Snow的追寻

    题目描述 Snow终于得知母亲是谁,他现在要出发寻找母亲. 王国中的路由于某种特殊原因,成为了一棵有n个节点的根节点为1的树,但由于"Birds are everywhere.", ...

  3. UNDO表空间不足解决方法

    确认UNDO表空间名称 select name from v$tablespace; 检查数据库UNDO表空间占用空间情况以及数据文件存放位置: select file_name,bytes/1024 ...

  4. js和php中几种生成验证码的方式

    之前做过取随机数和生成验证码的练习,都是通过取随机数作为数组下标,然后从数组中取值的方式(js): /*验证码*/ function sj_yzm(){ //存一个包括数字和字母的数组 var zon ...

  5. Java命名规范(新手宝典)

    很多刚开始学习Java的童鞋都不知道如何命名类文件,方法名,字段名,常量名等,今天抽出时间整理了了一下.大佬绕过 Java命名的组成规则:英文大小写字母,数字,$和_. 这里有几点需要注意: 不能以数 ...

  6. HTML-ul分分钟理解

    在HTML中,列表有三种,如图分别是有序.无序和自定义列表.上面是我在网络上找到的一张图片很明了就看以看出来,今天要分享的就是其中的无序列表Ul(unordered list),给大家整理了一下我所知 ...

  7. HTML--form表单中的label标签

    小伙伴们,你们在前面学习表单各种控件的时候,有没有发现一个标签--label,这一小节就来揭晓它的作用. label标签不会向用户呈现任何特殊效果,它的作用是为鼠标用户改进了可用性.如果你在 labe ...

  8. 338 Counting Bits Bit位计数

    给定一个非负整数 num. 对于范围 0 ≤ i ≤ num 中的每个数字 i ,计算其二进制数中的1的数目并将它们作为数组返回.示例:比如给定 num = 5 ,应该返回 [0,1,1,2,1,2] ...

  9. vs项目结构解析

    当我们用VS开发一个项目的时候,首先应该清楚用VS这个IDE生成的一些文件和文件夹是什么意思,起什么作用,什么场合下使用. 因为我使用的是VS2015,就以这个为例来进行一些说明: 首先要做的是更改你 ...

  10. JS——思维拓展

    1.阶乘求和:4的阶乘是1*2*3*4 <script> function jiechen(value) { var n = 1; for (var i = 1; i <= valu ...