[poj] 2286 The Rotation Game || ID-DFS
原题
有1234四个数字,每个数字八个。有八种方向的移动,使得操作后中间八个方块的数字相同,求最小操作步数。
对于这种求最小步数的看起来就是dfs的题,就ID-DFS就好了。
//不知道为什么都是IDDFS,我的跑的这么慢……
#include<cstdio>
#include<vector>
using namespace std;
int a[30],in[10]={0,7,8,9,12,13,16,17,18},ans,cnt;
int chg[5][8]={{0},{0,1,3,7,12,16,21,23},{0,2,4,9,13,18,22,24},{0,11,10,9,8,7,6,5},{0,20,19,18,17,16,15,14}};
vector <char> v;
char as[10]=" ABCDFEHG";
int read()
{
int ans=0,fu=1;
char j=getchar();
for (;(j<'0' || j>'9') && j!='-';j=getchar()) ;
if (j=='-') j=getchar(),fu=-1;
for (;j>='0' && j<='9';j=getchar()) ans*=10,ans+=j-'0';
return ans*fu;
}
int stp()
{
int qwq=0,b[5]={0,0,0,0,0};
for (int i=1;i<=8;i++) b[a[in[i]]]++;
for (int i=1;i<=4;i++) qwq=max(qwq,b[i]);
return 8-qwq;
}
bool chk()
{
for (int i=1;i<8;i++)
if (a[in[i]]!=a[in[i+1]]) return 0;
return 1;
}
void change(int x)
{
int tmp=a[chg[x][1]];
for (int i=1;i<7;i++)
a[chg[x][i]]=a[chg[x][i+1]];
a[chg[x][7]]=tmp;
}
void rechange(int x)
{
int tmp=a[chg[x][7]];
for (int i=7;i>1;i--)
a[chg[x][i]]=a[chg[x][i-1]];
a[chg[x][1]]=tmp;
}
void dfs(int x)
{
if (ans) return ;
if (!x)
{
if (chk()) ans=1;
return ;
}
for (int i=1;i<=4;i++)
{
change(i);
if (stp()<=x) dfs(x-1);
if (ans)
{
v.push_back(as[i]);
return ;
}
rechange(i);
}
for (int i=2;i>=1;i--)
{
rechange(i);
if (stp()<=x) dfs(x-1);
if (ans)
{
v.push_back(as[i+4]);
return ;
}
change(i);
}
for (int i=4;i>2;i--)
{
rechange(i);
if (stp()<=x) dfs(x-1);
if (ans)
{
v.push_back(as[i+4]);
return ;
}
change(i);
}
}
int main()
{
while (1)
{
cnt=0;
ans=0;
v.clear();
a[1]=read();
if (!a[1]) break;
for (int i=2;i<=24;i++)
a[i]=read();
if (chk())
{
printf("No moves needed\n%d\n",a[18]);
continue;
}
while (!ans) dfs(++cnt);
for (int i=v.size()-1;i>=0;i--) putchar(v[i]);
printf("\n%d\n",a[18]);
}
return 0;
}
[poj] 2286 The Rotation Game || ID-DFS的更多相关文章
- POJ 2286 The Rotation Game(IDA*)
The Rotation Game Time Limit: 15000MS Memory Limit: 150000K Total Submissions: 6396 Accepted: 21 ...
- POJ 2286 The Rotation Game IDA*
(再一次感谢学长幻灯片) ID A* 随便自己yy了一下. 额嗯 思路什么的都没有问题 就是改不对.. 无奈地删代码...边删边交. 删啊删 哎呦 AC了 ... ... ... 找删的那一段 . o ...
- POJ - 2286 - The Rotation Game (IDA*)
IDA*算法,即迭代加深的A*算法.实际上就是迭代加深+DFS+估价函数 题目传送:The Rotation Game AC代码: #include <map> #include < ...
- POJ 2286 The Rotation Game 迭代搜索深度 + A* == IDA*
感觉这样的算法还是比較局限的吧,反复搜索是一个不好的地方,并且须要高效的估值函数来进行强剪枝,这点比較困难. 迭代搜索深度是一个比較炫酷的搜索方式,只是有点拿时间换空间的感觉. 首先迭代深度比較搓的写 ...
- 【POJ 2286】 The Rotation Game
[题目链接] http://poj.org/problem?id=2286 [算法] IDA* [代码] #include <algorithm> #include <bitset& ...
- The Rotation Game (POJ 2286) 题解
[问题描述] (由于是英文的,看不懂,这里就把大意给大家说一下吧……都是中国人,相信大家也不愿意看英文……) 如图,一个井字形的棋盘,中间有着1-3任意的数,有ABCDEFGH八个操作,每个操作意味着 ...
- POJ 3321 树状数组(+dfs+重新建树)
Apple Tree Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 27092 Accepted: 8033 Descr ...
- POJ 3009 Curling 2.0 回溯,dfs 难度:0
http://poj.org/problem?id=3009 如果目前起点紧挨着终点,可以直接向终点滚(终点不算障碍) #include <cstdio> #include <cst ...
- poj 1564 Sum It Up (DFS+ 去重+排序)
http://poj.org/problem?id=1564 该题运用DFS但是要注意去重,不能输出重复的答案 两种去重方式代码中有标出 第一种if(a[i]!=a[i-1])意思是如果这个数a[i] ...
随机推荐
- Redis高可用
redis高可用只要在于三个方面 主从复制 哨兵机制 集群机制 主从复制 主从复制作用: 1.数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式.2.故障恢复:当主节点出现问题时,可 ...
- oracle数据库 网页管理360浏览器登录不上
使用谷歌浏览器可以登陆,然后在使用360之类的浏览器 就可以登录了
- BeanUtils工具的实现
BeanUtils工具的实现 自定义一个将数据映射到类里的方法 方法一: package utils; import java.lang.reflect.Field; import java.lang ...
- dede后台添加优酷等视频iframe链接时被替换成了图片
添加文章时 添加优酷视频 :<iframe height=498 width=510 src='http://player.youku.com/embed/XNDAzNTAzODE4OA==' ...
- python__基础 : 类属性,类方法,静态方法
类属性 定义在类里面,方法外面的属性,一般属于这个类,如下面的 num 就是类属性: class Test: num = 类属性用 实例.类属性 或者 类.类属性 都可以访问, 如 a = Te ...
- 【JavaScript】jQuery绑定事件
jquery中直接绑定事件:只能用在程序中一开始就存在的html代码 目标元素.click(function(){ }) jquery中间接绑定事件: 如果目标元素是js生成的,则需要间接绑定事件,用 ...
- WPF Datagrid对鼠标单击进行响应,借助EventSetter
在做的一个c#的项目中发现Datagrid没办法直接对鼠标单击进行响应, 调用MouseDown事件也需要点击某一行第二次才能响应. 所以借助EventSetter来简单的实现了一个. 界面部分的代码 ...
- 机器学习实战 -- 决策树(ID3)
机器学习实战 -- 决策树(ID3) ID3是什么我也不知道,不急,知道他是干什么的就行 ID3是最经典最基础的一种决策树算法,他会将每一个特征都设为决策节点,有时候,一个数据集中,某些特征属 ...
- [Codeforces958E2]Guard Duty (medium)(区间DP)
Description 题目链接 Solution 可以把题目转化一下模型,将间隔取出来,转化为N-1个数,限制不能取相邻两个数,求取K个数的最小价值 设DP[i][j]表示前i个数取j个最大价值(第 ...
- python基础之正则表达式和re模块
正则表达式 就其本质而言,正则表达式(或 re)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现.正则表达式模式被编译成一系列的字节码,然后由用 ...