题目

分析:如果以当前3个小写字母的位置为状态,则问题转化为图上的最短路问题。但是如果每次都判断小写字母的下一步是否合法,那就是说每次移动都需要判断5^3,肯定会超时。可以把所有可以移动的格子找出来建立一张图,就是把障碍物给删除,统计每个可以空格或者有鬼的格子可以移动到哪些格子,这样在判断的时候就节省了许多时间。然后bfs找最短路。注意读入的时候要多读入一个换行符,因为scanf的缓冲区用完以后,必须要读入一个字符才能才能结束读入,另外就是建图,过程,这个题的建图我给满分。

 #include "iostream"
#include "cstdio"
#include "cstring"
#include "string"
#include "queue"
using namespace std;
const int maxn=;
int s[],t[];
int dx[]={-,,,,};
int dy[]={,,-,,};
int ind[maxn];
int g[maxn][];
int d[maxn][maxn][maxn];
bool conflict(int a,int b,int a2,int b2){
return a2==b2||(a2==b&&b2==a);
}
typedef struct
{
int a,b,c;
}Node;
int bfs()
{
queue<Node> que;
memset(d,-,sizeof(d));
Node f;
f.a=s[],f.b=s[],f.c=s[];
d[s[]][s[]][s[]]=;
que.push(f);
while(!que.empty()){
Node u=que.front(); que.pop();
int a=u.a,b=u.b,c=u.c;
if(a==t[]&&b==t[]&&c==t[]) return d[a][b][c];
for(int i=;i<ind[a];i++){
int a2=g[a][i];
for(int j=;j<ind[b];j++){
int b2=g[b][j];
if(conflict(a,b,a2,b2)) continue;
for(int k=;k<ind[c];k++){
int c2=g[c][k];
if(conflict(a,c,a2,c2)) continue;
if(conflict(b,c,b2,c2)) continue;
if(d[a2][b2][c2]!=-) continue;
Node zz;
zz.a=a2,zz.b=b2,zz.c=c2;
d[a2][b2][c2]=d[a][b][c]+;
que.push(zz);
}
}
}
}
return -;
}
int main()
{
int w,h,n;
while(scanf("%d%d%d\n",&w,&h,&n)==&&n)
{
string str[maxn];
for(int i=;i<h;i++)
getline(cin,str[i]);
int cnt=;
int x[maxn],y[maxn],id[maxn][maxn];
for(int i=;i<h;i++){ //建图
for(int j=;j<w;j++){
if(str[i][j]!='#'){
x[cnt]=i,y[cnt]=j,id[i][j]=cnt;
if(islower(str[i][j])) s[str[i][j]-'a']=cnt;
else if(isupper(str[i][j])) t[str[i][j]-'A']=cnt;
++cnt;
}
}
}
for(int i=;i<cnt;i++){
ind[i]=;
for(int dir=;dir<;dir++){
int nx=x[i]+dx[dir],ny=y[i]+dy[dir];
if(str[nx][ny]!='#')
g[i][ind[i]++]=id[nx][ny];
}
}
if(n<=){
ind[cnt]=;g[cnt][]=cnt; s[]=t[]=cnt++;
}
if(n<=){
ind[cnt]=;g[cnt][]=cnt; s[]=t[]=cnt++;
}
printf("%d\n",bfs()); }
}

搜索好题UVA1601的更多相关文章

  1. 搜索 水题&&错误集锦

    引子: 本以为搜索的题目老师也不会检查,结果今天早上loli慢悠悠的说:“请同学们提交一下搜索的题目~”,顿时心旌摇曳,却也只能装作镇定自若的样子,点了点头.. 然后就开始了今天的疯狂做题,虽说题目都 ...

  2. poj1088(记忆化搜索入门题)

    题目链接:http://poj.org/problem?id=1088 思路: 明显的记忆化搜索题,用dp[i][j]表示从(i,j)出发能滑的最远距离,用dfs搜索,若dp[x][y]>0即已 ...

  3. 【搜索好题】bzoj1501 [NOI2005]智慧珠游戏

    bzoj1501 [NOI2005]智慧珠游戏 搜索苟逼题系列. 暴力枚举每一种情况(包括旋转翻转全都考虑在内)然后码出代码. (正解似乎不是这样子的) 那年好像还有平衡树苟逼题维护数列233333心 ...

  4. hdu 1181:变形课(搜索水题)

    变形课 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Submis ...

  5. 【LOJ6043】「雅礼集训 2017 Day7」蛐蛐国的修墙方案(搜索技巧题)

    点此看题面 大致题意: 给你一个长度为\(n\)的排列\(p\),要求构造一个合法的括号序列,使得如果第\(i\)个位置是左括号,则第\(p_i\)个位置一定是右括号. 暴搜 很容易想出一个暴搜. 即 ...

  6. 搜索水题四连发_C++

    特别声明:以下题目有部分为原创题,涉及版权问题,不得转载,违者追究 法律责任! 话说这是一套神题,只有你想不到,没有你做不到 题目更正后比 Pascal 跑得还快哈~ 一道特别裸,但是特别坑的搜索题 ...

  7. 搜索刷题记录by cellur925

    我好菜啊!连暴搜都不会! 注意边界退出! 特开此帖,记录搜索学习之路!(逃) 1.全排列 2.八皇后 3.数的划分 由于此题有同一划分方法算一个的限制,我们为了避免搜多,可以使搜出的结果满足单调不降性 ...

  8. hdu3786 Floyd或搜索 水题

    题意: 找出直系亲属 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  9. UVA10118(记忆化搜索 + 好题)

    http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19440 题意,4堆不同颜色的糖果,每堆N个,从堆上往下拿,放入一个最大装5个 ...

随机推荐

  1. Spring实战Day7面向切面编程术语介绍

    #### 面向切面编程 为什么需要切面? 有些功能需要在应用中的多个地方使用到,但是我们又不想在着每个地方都调用他们 切面术语 通知(advice):切面需要完成的工作 通知的类型(什么时间完成工作) ...

  2. Ubuntu下使用UFW配置防火墙(简化iptables的操作)

    UFW全称为Uncomplicated Firewall,是Ubuntu系统上配置iptables防火墙的工具.UFW提供一个非常友好的命令用于创建基于IPV4,IPV6的防火墙规则. 但是,UFW是 ...

  3. android Activity生命周期的例子

    package com.example.yanlei.yl2; import android.app.AlertDialog; import android.content.DialogInterfa ...

  4. 安卓开发懒鬼最爱之ButterKnife,依赖注入第三方是库,进一步加速开发速度

    转载请注明出处:王亟亟的大牛之路 还在烦躁一大堆findById的控件操作而烦恼么? 平时,我们的那一系列findById是一个"浩大的project"样比例如以下 这是以前一个项 ...

  5. time machine不备份指定文件夹

    osx中常常会使用timemachine来备份一些文件,timemachine能够使某个文件夹恢复到之前某个时刻的状态,很的方便.但是备份须要空间,特别是有些我们并不想备份一些无关紧要的文件,比方电影 ...

  6. CSS3 animation(动画) 属性

    一.animation 1.CSS3 animation(动画) 属性 语法: animation: name duration timing-function delay iteration-cou ...

  7. 【软件project】菜鸟俯瞰软件project

    [背景]初次接触软件project,对软件project不是彻底的了解.但学完一遍软件project,我还是有些感触的. 以下我就对我这阶段的软工学习和理解做一下小小的总结,如有不妥之处.欢迎指正. ...

  8. qt动画入门

    Qt-4.6新增了Animation Framework(动画框架),让我们可以方便的写一些生动的程序. 不必像曾经的版本号一样,全部的控件都枯燥的呆在伟大光荣的QLayout里,或许它们可以唱个歌, ...

  9. hdu 4707 Pet(DFS &amp;&amp; 邻接表)

    Pet Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  10. HDU 5289 Assignment(多校联合第一场1002)

    Assignment Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total ...