HDU 1667 The Rotation Game (A*迭代搜索)
题目大意:略
每次选择一个最大深度K,跑IDA*
估价函数H=8-中间8个格里出现次数最多的数的个数x,即把它填满这个数最少需要8-x次操作,如果dep+H>K,就跳出..
深搜的时候暴力修改,记录操作的方向,回溯再改回来就行了,根本不用把网格压进状态里嘛..
又水了一篇博客
#include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define NN 2010
#define ll long long
#define uint unsigned int
#define ull unsigned long long
#define inf 0x3f3f3f3f
using namespace std; int ans[NN];
int mp[][],tmp[];
int xx[]={,,,,,,,,,,,,,,,,,,,,,,,};
int yy[]={,,,,,,,,,,,,,,,,,,,,,,,};
int sum[],op[NN],num;
int esti()
{
int x,y;
sum[]=sum[]=sum[]=;
x=xx[],y=yy[],sum[mp[x][y]]++;
x=xx[],y=yy[],sum[mp[x][y]]++;
x=xx[],y=yy[],sum[mp[x][y]]++;
x=xx[],y=yy[],sum[mp[x][y]]++;
x=xx[],y=yy[],sum[mp[x][y]]++;
x=xx[],y=yy[],sum[mp[x][y]]++;
x=xx[],y=yy[],sum[mp[x][y]]++;
x=xx[],y=yy[],sum[mp[x][y]]++;
return -max(sum[],max(sum[],sum[]));
}
void A(){
for(int i=;i<;i++)
mp[i][]=mp[i+][];
mp[][]=mp[][],mp[][]=;
}
void B(){
for(int i=;i<;i++)
mp[i][]=mp[i+][];
mp[][]=mp[][],mp[][]=;
}
void C(){
for(int i=;i>;i--)
mp[][i]=mp[][i-];
mp[][]=mp[][],mp[][]=;
}
void D(){
for(int i=;i>;i--)
mp[][i]=mp[][i-];
mp[][]=mp[][],mp[][]=;
}
void E(){
for(int i=;i>;i--)
mp[i][]=mp[i-][];
mp[][]=mp[][],mp[][]=;
}
void F(){
for(int i=;i>;i--)
mp[i][]=mp[i-][];
mp[][]=mp[][],mp[][]=;
}
void G(){
for(int i=;i<;i++)
mp[][i]=mp[][i+];
mp[][]=mp[][],mp[][]=;
}
void H(){
for(int i=;i<;i++)
mp[][i]=mp[][i+];
mp[][]=mp[][],mp[][]=;
} int dfs(int dep,int ma)
{
if(esti()==) return mp[][];
if(dep>=ma) return ;
if(esti()>ma-dep) return ;
int ans;
A();ans=dfs(dep+,ma);F();
if(ans){op[++num]=;return ans;}
B();ans=dfs(dep+,ma);E();
if(ans){op[++num]=;return ans;}
C();ans=dfs(dep+,ma);H();
if(ans){op[++num]=;return ans;}
D();ans=dfs(dep+,ma);G();
if(ans){op[++num]=;return ans;}
E();ans=dfs(dep+,ma);B();
if(ans){op[++num]=;return ans;}
F();ans=dfs(dep+,ma);A();
if(ans){op[++num]=;return ans;}
G();ans=dfs(dep+,ma);D();
if(ans){op[++num]=;return ans;}
H();ans=dfs(dep+,ma);C();
if(ans){op[++num]=;return ans;}
return ;
} int a[];
int main()
{
//freopen("t2.in","r",stdin);
while(scanf("%d",&a[])&&a[]!=)
{
ull S=;num=;
mp[xx[]][yy[]]=a[];
for(int i=;i<;i++){
scanf("%d",&a[i]);
mp[xx[i]][yy[i]]=a[i];
}
int ans;
ans=dfs(,);
if(ans){
printf("No moves needed\n%d\n",ans);
continue;
}
for(int k=;k<=;k++){
ans=dfs(,k);
if(ans){
for(int i=num;i>=;i--)
printf("%c",op[i]+'A'-);
puts("");
printf("%d\n",ans);
break;
}
}
}
return ;
}
HDU 1667 The Rotation Game (A*迭代搜索)的更多相关文章
- hdu 1667 The Rotation Game ( IDA* )
题目大意: 给你一个“井”子状的board,对称的由24个方块组成,每个方块上有123三个数字中的一个.给你初始状态,共有八种变换方式,求字典序最小的最短的的变换路径使得,board中间的八个方块上数 ...
- IDA*、操作打表、并行处理-The Rotation Game HDU - 1667
万恶之源 优秀题解 用文字终究难以穷尽代码的思想 思路 每次操作都有八种选择,相当于一棵每次延申八个子节点的搜索树,故搜索应该是一种方法.而这题要求求最少步数,我们就可以想到可以试试迭代加深搜索(但其 ...
- 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 ...
- 【HDOJ】1667 The Rotation Game
1. 题目描述有个#字型的条带,可以从横线或竖线进行循环移动,求通过各种移动最终使中心的8个字符全等的长度最短并相同长度字典序最小的操作序列.2. 基本思路24个数据,8种移动方式,数据量很小了,所以 ...
- 【学时总结】 ◆学时·II◆ IDA*算法
[学时·II] IDA*算法 ■基本策略■ 如果状态数量太多了,优先队列也难以承受:不妨再回头看DFS-- A*算法是BFS的升级,那么IDA*算法是对A*算法的再优化,同时也是对迭代加深搜索(IDF ...
- HDU 4708:Rotation Lock Puzzle
Rotation Lock Puzzle Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- HDU 4708 Rotation Lock Puzzle(模拟)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4708 题目大意:给定一个方形矩阵,边长为3-10的奇数.每一圈的数字可以沿着顺时针方向和逆时针方向旋转 ...
- POJ 2286 The Rotation Game 迭代搜索深度 + A* == IDA*
感觉这样的算法还是比較局限的吧,反复搜索是一个不好的地方,并且须要高效的估值函数来进行强剪枝,这点比較困难. 迭代搜索深度是一个比較炫酷的搜索方式,只是有点拿时间换空间的感觉. 首先迭代深度比較搓的写 ...
随机推荐
- 带你学C带你飞!
C语言免费课程推荐:带你学C带你飞! 想学习C语言,首先就要了解什么是C语言: C语言是一门通用计算机编程语言,应用广泛.C语言的设计目标是提供一种能以简易的方式编译.处理低级存储器.产生少量的机器码 ...
- Java从入门到精通一步到位!
Java作为近几年来非常火的编程语言,转行来做Java的人不计其数,但如今真正的人才仍然匮乏,所以学习Java一定要有一个系统的学习规划课程.阿里云大学帮您规划Java学习路线可以帮助您从一个小白成长 ...
- Activiti Workflow HelloWorld 示例与测试环境搭建
作者:Rock 出处:http://www.ecmkit.com/zh-hans/2012/03/21/activiti-workflow-hell Activiti Workflow HelloWo ...
- ES6 学习6 数组的扩展
本章学习要点: 扩展运算符 Array.from() Array.of() 数组实例的 copyWithin() 数组实例的 find() 和 findIndex() 数组实例的 fill() 数组实 ...
- Github添加SSHkey
Git详细教程可参考廖雪峰的Git教程 1. 打开 Git Bash,输入cd ~/.ssh——回车(看你是否有了ssh key 密钥,有了就备份): 2. 输入ssh-keygen -t rsa - ...
- Laravel核心解读--Contracts契约
Contracts Laravel 的契约是一组定义框架提供的核心服务的接口, 例如我们在介绍用户认证的章节中到的用户看守器契约IllumninateContractsAuthGuard 和用户提供器 ...
- NYIST 1107 最高的奖励
最高的奖励 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 请问:挖掘机技术哪家强?AC了告诉你! 给你N(N<=3*10^4)个任务,每个任务有一个截止完成时 ...
- iBase4J部署总结
iBase4J部署总结 序言 最近看到个分布式框架,只有一个字:好.所以部署起来看看.开始的时候说实话遇到了点困难.去码云上看了下,貌似想得到指导要加入一个群,而且需要收费的,反正闲来无事,索性自己搞 ...
- WinServer-IIS-IIS负载均衡
安装应用程序路由 提供的服务器的地址必须是可以访问,不然无法进入到下面的这个管理界面 来自为知笔记(Wiz)
- Android开发之AudioManager(音频管理器)具体解释
AudioManager简单介绍: AudioManager类提供了訪问音量和振铃器mode控制. 使用Context.getSystemService(Context.AUDIO_SERVICE)来 ...