hdu 1667:The Rotation Game
题目可以看IDA*学习笔记-HDU1667 The Rotation Game_ex_voda的博客-CSDN博客
关于如何存储这个条状数组,我们开一个大的矩阵数组装下来就行了。当然,特殊坐标单独开两个数组记录。
操作函数很明显要写ABCDEF啥的,很简单,写个循环就行。
我们可以想象,这里面如果123里面最多的数的个数,再用8减掉,就是至少要移动的次数,因为我们移动一次能够改变一个数。根据这个进行剪枝。并且当最多的个数是8时,已经搜索到终点。
接下来是ida*逻辑:
我们需要记录当前的深度和允许到达的深度。
如果当前全是1or2or3,则从那8个数里挑一个返回。
如果深度已经大于等于最深深度,直接返回0表示失败。
如果当前8-有效区域里边123里的最多的数的个数>最深深度减去当前深度,说明无法到达。剪枝。
从各个方向ABCDEF都走一遍,记得相反方向回溯,然后看返回值是否成功,如果成功,则记录方向,这里可以看出来方向是反过来记录的。
代码如下所示:
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<list>
#include<vector>
#include<string>
#include<iostream>
#include<ctime>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
using namespace std;
#define NN 2010
#define ll long long
#define uint unsigned int
#define ull unsigned long long
#define inf 0x3f3f3f3f
int ans[NN],a[25];
int mp[20][20],tmp[10];
int xx[]={1,1,2,2,3,3,3,3,3,3,3,4,4,5,5,5,5,5,5,5,6,6,7,7};
int yy[]={3,5,3,5,1,2,3,4,5,6,7,3,5,1,2,3,4,5,6,7,3,5,3,5};
int sum[5],op[NN],num;int esti(){sum[1]=sum[2]=sum[3]=0;sum[mp[xx[6]][yy[6]]]++;sum[mp[xx[7]][yy[7]]]++;sum[mp[xx[8]][yy[8]]]++;sum[mp[xx[11]][yy[11]]]++;sum[mp[xx[12]][yy[12]]]++;sum[mp[xx[15]][yy[15]]]++;sum[mp[xx[16]][yy[16]]]++;sum[mp[xx[17]][yy[17]]]++;return 8- max(sum[1], max(sum[2],sum[3]));
}void A(){for(int i=0;i<7;i++)mp[i][3]=mp[i+1][3];mp[7][3]=mp[0][3],mp[0][3]=0;
}
void B(){for(int i=0;i<7;i++)mp[i][5]=mp[i+1][5];mp[7][5]=mp[0][5],mp[0][5]=0;
}
void C(){for(int i=8;i>1;i--)mp[3][i]=mp[3][i-1];mp[3][1]=mp[3][8],mp[3][8]=0;
}
void D(){for(int i=8;i>1;i--)mp[5][i]=mp[5][i-1];mp[5][1]=mp[5][8],mp[5][8]=0;
}
void E(){for(int i=8;i>1;i--)mp[i][5]=mp[i-1][5];mp[1][5]=mp[8][5],mp[8][5]=0;
}
void F(){for(int i=8;i>1;i--)mp[i][3]=mp[i-1][3];mp[1][3]=mp[8][3],mp[8][3]=0;
}
void G(){for(int i=0;i<7;i++)mp[5][i]=mp[5][i+1];mp[5][7]=mp[5][0],mp[5][0]=0;
}
void H(){for(int i=0;i<7;i++)mp[3][i]=mp[3][i+1];mp[3][7]=mp[3][0],mp[3][0]=0;
}int ida(int dep, int tot){if (esti()==0) return mp[3][3];if (dep>=tot) return 0;if (esti()>tot-dep) return 0;int ans;A();ans=ida(dep+1,tot);F();if(ans){op[++num]=1;return ans;}B();ans=ida(dep+1,tot);E();if(ans){op[++num]=2;return ans;}C();ans=ida(dep+1,tot);H();if(ans){op[++num]=3;return ans;}D();ans=ida(dep+1,tot);G();if(ans){op[++num]=4;return ans;}E();ans=ida(dep+1,tot);B();if(ans){op[++num]=5;return ans;}F();ans=ida(dep+1,tot);A();if(ans){op[++num]=6;return ans;}G();ans=ida(dep+1,tot);D();if(ans){op[++num]=7;return ans;}H();ans=ida(dep+1,tot);C();if(ans){op[++num]=8;return ans;}return 0;
}int main() {while (scanf("%d",&a[0]) && a[0]){num=0;mp[xx[0]][yy[0]]=a[0];for (int i = 1; i < 24; ++i) {scanf("%d", &a[i]);mp[xx[i]][yy[i]]=a[i];}int ans = ida(0,0);if (ans){printf("No moves needed\n%d\n",ans);continue;}for (int i = 1; i <= 500; ++i) {num=0;ans = ida(0, i);if (ans){for (int j = num; j >= 1; --j) {printf("%c",op[j]+'A'-1);}puts("");printf("%d\n",ans);break;}}}return 0;
}
hdu 1667:The Rotation Game相关推荐
- HDU 1667 The Rotation Game
参考文章:http://blog.csdn.net/urecvbnkuhbh_54245df/article/details/5856756 The portal:http://acm.hdu.edu ...
- 【搜索进阶】HDU 1667 The Rotation Game
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1667 IDA*的入门题目,状态过多容易超内存,正好体现了IDA*的优势,每次操作移动能使一个数字进入中 ...
- HDU 1667 The Rotation Game (A*迭代搜索)
题目大意:略 每次选择一个最大深度K,跑IDA* 估价函数H=8-中间8个格里出现次数最多的数的个数x,即把它填满这个数最少需要8-x次操作,如果dep+H>K,就跳出.. 深搜的时候暴力修改, ...
- hdu 1667 The Rotation Game(IDA*)
题目大意: 有一个井字形结构的图形,每条线上7个数字(1,2,3,),每次可以从八个方向将一条线上的数字循环移动1个距离,问经过最少几次什么操作,可以将图形中间的八个方块变成同一种数字. 解题思路: ...
- HUD 1043 Eight 八数码问题 A*算法 1667 The Rotation Game IDA*算法
先是这周是搜索的题,网站:http://acm.hdu.edu.cn/webcontest/contest_show.php?cid=6041 主要内容是BFS,A*,IDA*,还有一道K短路的,.. ...
- hdu 1667(IDA*)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1667 思路:大牛说是IDA*的入门题=.=构造h()=8-max(1,2,3); max(1,2,3 ...
- 【HDU】3441 Rotation
题意:给出A和C(1<=A,C<=10^9),所有满足B * B * K + 1 = A * A, (K >= 0)的B,构成边长为B的正方形,等角度的围绕在一个小正方形的周围.用C ...
- hdu 1667 IDA*
第一道IDA*...... 给链接:点击打开链接 AC代码如下: #include <iostream> #include <cstring> #include <cst ...
- 杭电OJ分类题目(1)
原题出处:HDOJ Problem Index by Type,http://acm.hdu.edu.cn/typeclass.php 杭电OJ分类题目(1) HDU Introduction HDU ...
最新文章
- ASP.NET实现数据图表
- 误删除的文件夹还能恢复吗?
- 自然语言处理python进阶(二)
- CHUNGHOP k-6868万能空调遥控器的自己家用电器的代码+自己家里的宽带账号+机顶盒型号+桌子+椅子+垫子高度
- CompletableFuture详解~thenAcceptBoth
- Mysql在可视化工具navicat中如何解决输入小数变整数的问题,(改变小数位数)
- 【JVM】JVM指令集总结
- DataFountain新上计算机视觉比赛-20万巨奖数钢筋
- mysql自带压测工具--mysqlslap
- java log输出到文件路径_log4j中日志输出文件指定相对路径的方法
- intval0.57100 php_关于PHP浮点数之 intval((0.1+0.7)*10) 为什么是7
- tensorflow.python.framework.tensor_shape.TensorShape 类
- 推荐一款非常好用的文本替换工具“Replace Pioneer”
- 钉钉小程序 DEMO的坑
- android app红点提示,技巧|手机提示软件更新的小红点逼得我强迫症犯了,怎么去掉提示?...
- android 取消root,彻底告别安卓刷机时代!360超级ROOT正式宣布下线:取消ROOT权限
- python turtle 海龟绘图详解(官方文档中文版)
- office2019 retail零售版转换vol批量授权版 cmd批处理命令 kms示例
- python游戏编程快速上手pdf_Python游戏编程快速上手 (斯维加特著) 中文pdf完整版[18MB]...
- c语言strcpy两字符串长度不同,(C语言)自己写字符串操作函数(一)——strlen/strcpy/strcat/strcmp/st...
热门文章
- 在计算机之间怎样进行软件传送,【电脑篇】巧借局域网,告别第三方工具便捷实现电脑间的文件传输...
- [电影]吴宇森之《喋血街頭》
- CAD关于块表操作(com接口c#语言)
- Jenkins + fastlane
- 记 / ENVI5.3温度反演-单窗算法-操作要点
- Spring Boot: Unable to start EmbeddedWebApplicationContext due to missing Embedd
- android adt,sdk,google map api…
- 面向网络舆情的关联度分析(一)
- 神经网络模型matlab例子,神经网络算法matlab
- 剑网3服务器延迟高,Win7电脑下新剑侠情缘3台服延迟高的解决方法