UVA1601 状态搜索
很有意思的一道题,就是迷宫问题的增强版。但是细节很多,有一个技巧就是把每个可以走的位置编号方便状态判重。
AC代码:
#include<cstdio>
#include<cstring>
#include<queue>
#include<iostream>
using namespace std;
const int maxs=20;
const int maxn=150;
const int dx[]={1,-1, 0, 0, 0};
const int dy[]={0, 0, 1,-1, 0};
int s[3],t[3];
int deg[maxn], G[maxn][5];
int d[maxn][maxn][maxn]; //记录步数
struct node //记录状态
{
int a,b,c;
node(int x,int y,int z):a(x),b(y),c(z){}
};
bool conflict(int a,int b,int a1,int b1)
{
return a1==b1||(a1==b&&b1==a); //判断是否移动到同一个格子或者在一步中互换了位置
}
int bfs()
{
queue<node>q;
memset(d,-1,sizeof(d));
d[s[0]][s[1]][s[2]]=0;
q.push(node(s[0],s[1],s[2]));
while(!q.empty())
{
node u=q.front(); q.pop();
int a=u.a,b=u.b,c=u.c;
if(a==t[0]&&b==t[1]&&c==t[2]) return d[a][b][c];
//开始移动,移动时需要判断是否移动到同一个位置
for(int i=0;i<deg[a];++i)
{
int a1=G[a][i];
for(int j=0;j<deg[b];++j)
{
int b1=G[b][j];
if(conflict(a,b,a1,b1)) continue;
for(int k=0;k<deg[c];++k)
{
int c1=G[c][k];
if(conflict(a,c,a1,c1)) continue;
if(conflict(b,c,b1,c1)) continue;
if(d[a1][b1][c1]!=-1) continue;
d[a1][b1][c1]=d[a][b][c]+1;
q.push(node(a1,b1,c1));
}
}
}
}
}
int main()
{
int w, h, n;
while(scanf("%d%d%d\n",&w,&h,&n)==3&&w!=0)
{
char res[maxs][maxs];
for(int i=0;i<h;++i) fgets(res[i],20,stdin);
int cnt=0;
int x[maxn],y[maxn],id[maxs][maxs];
//给每个空格编号,很好的技巧,可以提高状态转换、判重的效率
for(int i=0;i<h;++i)
for(int j=0;j<w;++j)
{
if(res[i][j]!='#')
{
x[cnt]=i;y[cnt]=j;id[i][j]=cnt;
if(islower(res[i][j])) s[res[i][j]-'a']=cnt;
else if(isupper(res[i][j])) t[res[i][j]-'A']=cnt;
++cnt;
}
}
for(int i=0;i<cnt;++i)
{
deg[i]=0;
for(int dir=0;dir<5;++dir)
{
int px=x[i]+dx[dir],py=y[i]+dy[dir];
if(px<0||px>=h||py<0&&py>=w) continue;
if(res[px][py]!='#') G[i][deg[i]++]=id[px][py]; //当前空格的临近空格
}
}
//为了简化代码,给少于三个鬼的情况增加到三个点,新增的点被处理为无法移动。
if(n<=2) {deg[cnt] = 1; G[cnt][0] = cnt; s[2]=t[2]=cnt++;}
if(n<=1) {deg[cnt] = 1; G[cnt][0] = cnt; s[1]=t[1]=cnt++;}
printf("%d\n",bfs());
}
return 0;
}
如有不当之处欢迎指出!!
UVA1601 状态搜索的更多相关文章
- ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 A、Saving Tang Monk II 【状态搜索】
任意门:http://hihocoder.com/problemset/problem/1828 Saving Tang Monk II 时间限制:1000ms 单点时限:1000ms 内存限制:25 ...
- UVALive 6255 Kingdoms --状态搜索
题意:n个国家,给出国家间相互的债务关系,每个国家如果债务>收入就要破产,破产后该国的所有债务关系全部清除,第一个破产的国家不同有可能造成最后的没破产的国家的不同,问哪些国家有可能成为独自存活的 ...
- 用BFS和DFS解决圆盘状态搜索问题
人工智能课程的实验(我的解法其实更像是算法课程的实验) 用到的算法:深度优先搜索.宽度优先搜索(状态扩展的不同策略) 数据结构:表示状态的结构体.多维数组 (可能是最近做算法竞赛题的影响,这次并不像以 ...
- Oj 24260: Lilypad Pond (神奇广搜题,状态搜索)
题目 为了让奶牛们娱乐和锻炼,约翰建造了一个美丽的池塘.这个池塘是矩形的,可以分成M×N个方格.一些格子是坚固得令人惊讶的莲花,还有一些是岩石,其余的只是美丽,纯净,湛蓝的水.贝西正在练习芭蕾舞,她站 ...
- BFS + 状态搜索
题目 题意 给一个100x100的迷宫,'.'表示路面,'S'表示起点,'T'表示终点:'#'表示毒气区,进入毒气区必须要消耗一个氧气:'B'表示氧气区,每次进入自动获得一个氧气,可反复进入从而获得多 ...
- laravel使用when搜索遇到状态参数(有0的状态)的坑
今天,使用when()方法写活动列表的接口,有两个状态搜索,都有0这个状态,当传参为0时when()就失效了... 反反复复的验证参数,传参确实是0和1啊...百思不得其解~~~后面仔细想想when( ...
- [学习笔记]搜索——模拟与dp的结合
搜索: 一种基础的算法. 考察常见于NOIP 但是高级的搜索算法可能还会在省选出现. 50%以上的暴力都可以用搜索直接枚举来写. 但是,当数据规模不是很大的时候,搜索也可能成为正解. (比如剪枝PK状 ...
- Button Bashing(搜索)
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAx8AAAI2CAIAAAC+EqK4AAAgAElEQVR4nOydf0BT9f7/37fS423mWn
- POJ2676 (数独问题 + DLX + 状态优化顺序)
(1)最简单的最是去暴力DFS搜索答案 , 很容易想到 , 每行每列的方式去搜索 , 不过效率是真的不行;但这个还是给出代码 ,毕竟打了也不容易呀! #include<cstdio> #i ...
随机推荐
- Linxu指令--crond
前一天学习了 at 命令是针对仅运行一次的任务,循环运行的例行性计划任务,linux系统则是由 cron (crond) 这个系统服务来控制的.Linux 系统上面原本就有非常多的计划性工作,因此这个 ...
- shell中数组讲解
定义数组 在Shell中,用括号来表示数组,数组元素用"空格"符号分割开.定义数组的一般形式为: 代码如下: 数组名=(值1 值2 ... 值n) 例如: 代码如下: array_ ...
- [Bug] 解决 Sql Server 数据库死锁问题
SELECT request_session_id spid, OBJECT_NAME(resource_associated_entity_id) tableName FROM sys.dm_tra ...
- vs2012编译在win7 32位电脑和win xp电脑上运行的win32程序遇到的问题记录
一.win7 32位电脑: vs2012编译的64位程序是没有问题的.但编译的32位程序在别的电脑(虚拟机模拟)出错: 感觉很无语,vs这么牛逼的东西,在设计时候都不考虑这些吗? 在自己电脑C:\Wi ...
- 蓝桥杯练习系统—基础练习 sine之舞
题目:最近FJ为他的奶牛们开设了数学分析课,FJ知道若要学好这门课,必须有一个好的三角函数,所以他准备和奶牛们做一个"Sine之舞"的游戏,寓教于乐,提高奶牛们的计算能力. 不妨设 ...
- jQuery选择器概述
1.基本选择器:1) #id : 根据给定的id匹配一个元素:2) .class: 根据给定的类名匹配元素:3)element: 根据给定的元素名匹配元素:4)* : 匹配所有元素:5)selecto ...
- 随机切换IP和UA
在爬虫爬取过程中,网站会根据我们的IP和UA去确认到底是浏览器操作还是爬虫在操作,所以,为了让爬虫不被网站禁止,随机切换Ip 和UA是很重要的,因为这个类在各个爬虫中经常要用到,所以可以自已维护一份随 ...
- IO模型浅析
IO模型 同步.异步.阻塞.非阻塞 同步: 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回.也就是必须一件一件事做,等前一件做完了才能做下一件事. 例如普通B/S模式(同步): ...
- Maven pom.xml简单归结
Maven pom.xml文件解释 请确保有相关的maven知识,包括Maven安装.Maven settings.xml解读.本文对POM的一些属性作一些摘录,详细的配置可查看此篇转载文章" ...
- BZOJ 4710: [Jsoi2011]分特产 [容斥原理]
4710: [Jsoi2011]分特产 题意:m种物品分给n个同学,每个同学至少有一个物品,求方案数 对于每种物品是独立的,就是分成n组可以为空,然后可以用乘法原理合起来 容斥容斥 \[ 每个同学至少 ...