【问题描述】

(由于是英文的,看不懂,这里就把大意给大家说一下吧……都是中国人,相信大家也不愿意看英文……)

如图,一个井字形的棋盘,中间有着1-3任意的数,有ABCDEFGH八个操作,每个操作意味着该操作所在行朝该操作方向整体移动一格,详见图,你的目的是:对于输入的多组数据,用最少的步数使得井字形棋盘中间的八个数为同一个数,若不需操作就已达到要求,则输出“No moves needed”,无论是否需要操作,你都应将中间的数字给输出。输入以一个0结束。

【样例输入】

1 1 1 1 3 2 3 2 3 1 3 2 2 3 1 2 2 2 3 1 2 1 3 3

1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3

0

【样例输出】

AC

2

DDHH

2

【解题思路】

又是一道求最少步数的题目……果断写广搜,然而,写完广搜后,我奇迹般地发现……MLE了…………………………空间只给了150MB,我再一看时间………………15000ms……也不想多说什么了,赶紧用上今天刚学的IDA*算法。

IDA*算法是一种将估价函数与深搜结合的搜索方法,搜索方式是用深度优先搜索的方式,搜完第k层若还没有结果,那么就退出,然后从第一层开始搜到第k+1层,不断加深所搜的层数,因此又叫迭代加深搜索。其实说这么复杂,按我的理解,就是用深搜来做的广搜……

现在我们来看一下题目。因为是井字型棋盘,且输入还是一行数,那么,我们就给棋盘上的数标上号,分别为1-24,那么八个移动的过程也可以表示出来了,然后由于是深搜,那么就还有回溯的过程,对于每一个操作,都需要一个反操作,而题目中正好又提示了我们,A的反操作是F等等,因此,我们只需要记录每个操作的反操作是第几个就行了。

然后是边界条件,这里的边界条件是当搜索层数大于当前所设置的最大深度限制时,便退出,实际上每一个迭代加深搜索都有这个边界条件,而另外的边界条件则因题目而异,这道题则不需要其他的边界条件,满足要求退出即可。

接下来考虑初始化的问题,我们在找中间的值的时候,自然是要找最多的数,然后将其他的数移成这个数就行了,那么估价函数就是8-最大的数的个数,从这个估价函数的层数开始搜索,详见代码。

【代码实现】

 const xh:array[..,..] of longint=((,,,,,,),(,,,,,,),(,,,,,,),(,,,,,,),(,,,,,,),(,,,,,,),(,,,,,,),(,,,,,,));
fan:array[..] of longint=(,,,,,,,);
op:array[..] of char=('A','B','C','D','E','F','G','H');
mid:array[..] of longint=(,,,,,,,);
var n,m,dep:longint;
s:array[..] of longint;
a:array[..] of longint;
i,j:longint;
function max(a,b,c:longint):longint;
begin
max:=a;
if b>max then
max:=b;
if c>max then
max:=c;
end;
function get:longint;
var i:longint;
cnt:array[..] of longint;
begin
fillchar(cnt,sizeof(cnt),);
for i:= to do
inc(cnt[s[mid[i]]]);
exit(-max(cnt[],cnt[],cnt[]));
end;
procedure move(k:longint);
var i,t:longint;
begin
t:=s[xh[k,]];
for i:= to do
s[xh[k,i]]:=s[xh[k,i+]];
s[xh[k,]]:=t;
end;
function dfs(k:longint):boolean;
var i,h:longint;
begin
if k>=dep then
exit(false);
for i:= to do
begin
move(i);//移动
a[k]:=i;
h:=get;//求最多的数的个数
if h= then exit(true);
if (k+h<dep)and(dfs(k+)) then//深搜
exit(true);
move(fan[i]);//回溯
end;
exit(false);
end;
begin
read(s[]);
while s[]<> do
begin
for i:= to do
read(s[i]);
dep:=get;
if dep= then
begin
writeln('No moves needed');//所给数据本就满足要求,输出,退出
writeln(s[]);
read(s[]);
continue;
end;
while not(dfs()) do//如果不满足要求,加深层数,再进行深搜
inc(dep);
for i:= to dep- do
write(op[a[i]]);
writeln;
writeln(s[]);
read(s[]);
end;
end.

The Rotation Game (POJ 2286) 题解的更多相关文章

  1. POJ 2286 The Rotation Game(IDA*)

    The Rotation Game Time Limit: 15000MS   Memory Limit: 150000K Total Submissions: 6396   Accepted: 21 ...

  2. 【POJ 2286】 The Rotation Game

    [题目链接] http://poj.org/problem?id=2286 [算法] IDA* [代码] #include <algorithm> #include <bitset& ...

  3. POJ - 2286 - The Rotation Game (IDA*)

    IDA*算法,即迭代加深的A*算法.实际上就是迭代加深+DFS+估价函数 题目传送:The Rotation Game AC代码: #include <map> #include < ...

  4. POJ 2286 The Rotation Game 迭代搜索深度 + A* == IDA*

    感觉这样的算法还是比較局限的吧,反复搜索是一个不好的地方,并且须要高效的估值函数来进行强剪枝,这点比較困难. 迭代搜索深度是一个比較炫酷的搜索方式,只是有点拿时间换空间的感觉. 首先迭代深度比較搓的写 ...

  5. [poj] 2286 The Rotation Game || ID-DFS

    原题 有1234四个数字,每个数字八个.有八种方向的移动,使得操作后中间八个方块的数字相同,求最小操作步数. 对于这种求最小步数的看起来就是dfs的题,就ID-DFS就好了. //不知道为什么都是ID ...

  6. POJ 2286 The Rotation Game IDA*

    (再一次感谢学长幻灯片) ID A* 随便自己yy了一下. 额嗯 思路什么的都没有问题 就是改不对.. 无奈地删代码...边删边交. 删啊删 哎呦 AC了 ... ... ... 找删的那一段 . o ...

  7. poj 3744 题解

    题目 题意: $ yyf $ 一开始在 $ 1 $ 号节点他要通过一条有 $ n $ 个地雷的道路,每次前进他有 $ p $ 的概率前进一步,有 $ 1-p $ 的概率前进两步,问他不领盒饭的概率. ...

  8. poj 3061 题解(尺取法|二分

    题意 $ T $ 组数据,每组数据给一个长度 $ N $ 的序列,要求一段连续的子序列的和大于 $ S $,问子序列最小长度为多少. 输入样例 2 10 15 5 1 3 5 10 7 4 9 2 8 ...

  9. POJ 3977 题解

    题目 Given a list of N integers with absolute values no larger than \(10^{15}\), find a non empty subs ...

随机推荐

  1. iOS 模态视图

    模态视图不是专门的某个类,而是通过视图控制器的presentViewController方法弹出的视图,我们称为模态视图. 模态视图出现的场景一般是临时弹出的窗口,譬如:登录窗口: 模态视图弹出时通过 ...

  2. locals()函数访问当前还在作用范围内的局部变量

    >>> element = 'silver' >>> number = 47 >>> 'Element {number} is {element} ...

  3. cocos2d-lua 3.5 android搭建步骤

    cocos2d-lua 3.5 android搭建步骤 如何安装eclipse,jdk,android sdk,ndk这里都不说了,资料很多,而且以前用eclipse搭建cocos2d-x-c++的时 ...

  4. 树状数组POJ2352星星

    http://poj.org/problem?id=2352 这道题的题意对于住学者应该比较难理解,但是如果弄明白他的意思的话,你就会发现这就是赤裸裸的树状数组,哎,欺负我不懂是吧,当时读题读啦好久, ...

  5. java.io.Serializable浅析

    转自:http://www.cnblogs.com/gw811/archive/2012/10/10/2718331.html Java API中java.io.Serializable接口源码: p ...

  6. 关于显示gif的一些方法与讨论

    http://www.2cto.com/kf/201404/292468.html http://www.eoeandroid.com/forum.php?mod=viewthread&tid ...

  7. 队列理论和队列网络模型 queueing theory and queueing network model

    1队列理论 1.1队列在生活中随处可见,例如排队买票,排队打饭,排队做地铁等等.那将诸如此类的队列抽象一下,可归纳为一下5要术: 到达过程arrival process 服务时间的分布 service ...

  8. Git使用手册:HTTPS和SSH方式的区别和使用

    在管理Git项目上,很多时候都是直接使用https url克隆到本地,当然也有有些人使用SSH url克隆到本地.这两种方式的主要区别在于:使用https url克隆对初学者来说会比较方便,复制htt ...

  9. Android开发-API指南-<provider>

    <provider> 英文原文:http://developer.android.com/guide/topics/manifest/provider-element.html 采集(更新 ...

  10. 翻译的技巧(The Technique of Translation)——前言

    曰:你要发文章才能毕业! 答:谨遵圣命-- 缘起 研三了,要找工作了,要离开学校了,又要像浮萍般飘荡在世上了,还是学校好呀!本以为写个毕业论文就可以了,谁知老板幽幽地说写篇文章发了吧.我竟无言以对.不 ...