题目

分析:如果以当前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. 一点点VIM

    VIM 当你喜欢它时,你会发现真的不错,不过配置真是麻烦, 不过万事开头难,当你熟练时真的会发现她的美. syntax on set nu colo evening set mouse=a set c ...

  2. Java成长之路

    怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名合格的架构师应该有怎样的技术知识体系,这是不仅一个刚刚踏入职场的初级程序员也是工作三五年之后开始迷茫的老程序员经常会问到的问题.希 ...

  3. 【JavaScript】数据类型

    学习不论什么一种程序设计语言.数据类型都是不可缺少的一部分内容,非常基础,也非常重要.该用何种数据类型定义变量.这也是编程中最基础的一项. ECMAScript中有5种简单数据类型:Undefined ...

  4. 标C编程笔记day04 预处理、宏定义、条件编译、makefile、结构体使用

    预处理:也就是包括须要的头文件,用#include<标准头文件>或#include "自己定义的头文件" 宏定义,如:#define PI 3.1415926 查看用宏 ...

  5. weex 项目开发(二) weex 与 weexpack 的区别

    1.weex 与 weexpack 即  weex-toolkit 与 weexpack 的区别 weex-toolkit 初始化的项目是针对开发单个 Weex 页面而设计的,也就是说这样的项目只包括 ...

  6. POJ 3928 Ping pong 树状数组模板题

    開始用瓜神说的方法撸了一发线段树.早上没事闲的看了一下树状数组的方法,于是又写了一发树状数组 树状数组: #include <cstdio> #include <cstring> ...

  7. U盘 文件被隐藏解决办法

    原地址:http://www.deyi.com/thread-351635-1-1.html 方法:运行cmd( 在任意目录都行)单个文件 :attrib c:\"要修改的文件夹名字&quo ...

  8. javascript参数arguments对象

    ECMAScript函数的参数与大多树其他语言中函数的参数有所不同.ECMAScript函数不介意传递进来多少个参数,也不在乎传进来参数是什么类型.函数体是通过arguments对象来访问参数数组.a ...

  9. Codeforces Round #426 (Div. 2) D. The Bakery 线段树优化DP

    D. The Bakery   Some time ago Slastyona the Sweetmaid decided to open her own bakery! She bought req ...

  10. sql insert and update

    1 二者的区别 insert是插入一条新的数据,它会创建一条新的记录:update是更新一条已经有的数据,它不会创建新的记录. update需要where来指示更新那条记录,否则会更新所有的记录. 2