[poj2286]The Rotation Game (IDA*)
//第一次在新博客里发文章好紧张怎么办
//MD巨神早已在一个小时前做完了
Time Limit: 15000MS | Memory Limit: 150000K | |
Total Submissions: 5950 | Accepted: 1992 |
Description

Initially, the blocks are placed on the board randomly. Your task is to move the blocks so that the eight blocks placed in the center square have the same symbol marked. There is only one type of valid move, which is to rotate one of the four lines, each consisting of seven blocks. That is, six blocks in the line are moved towards the head by one block and the head block is moved to the end of the line. The eight possible moves are marked with capital letters A to H. Figure 1 illustrates two consecutive moves, move A and move C from some initial configuration.
Input
Output
Sample Input
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
Sample Output
AC
2
DDHH
2
------------------------------------------------------------------------------------------------------
poj英文题的尿性呵呵哒
大概就是把那个棋盘的abcdef轴旋转次数最少使得中间那几个数字相同(注意只有1,2,3)
那么先找规律,就是把输入数据的位置与abcdef对应
接下来因为搜索层数未知,dfs会TLE,bfs会MLE,所以容易想到ID搜索
先指定递归层数,然后迭代加深一层一层搜下去(有的说用二分但这种小数据反而更费时)
再看每一层的搜索方向
联想八数码问题(然而并不清楚八数码问题),发现每个状态都有最多递归的层数(八个位置贪心减去目前最多的数字个数)
那么写一个估价函数猜猜最多搜多少,如果超出了层数限制那就剪枝,这样就有了IDA*
(我在说些什么)
代码代码代码我要去睡
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<string.h>
4 #include<limits.h>
5 int min(int a,int b){
6 return a<b?a:b;
7 }
8 int lines[][]={
9 { , , ,,,,},// A
{ , , ,,,,},// B
{, , , , , , },// C
{,,,,,,},// D
{,,,, , , },//E
{,,,, , , },//F
{,,,,,,},//G
{ , , , , , ,},//H
};
int matrix[]={,,,,,,,};
int cross[];
char ans[];
int check(){
for(int i=;i<;i++)if(cross[matrix[]]!=cross[matrix[i]])return ;
return ;
}
int predict(){
int most=;
for(int i=;i<=;i++){
int a=;
for(int j=;j<;j++)if(cross[matrix[j]]!=i)a++;
most=min(most,a);
}
return most;
}
int rotate(int mode){
int le=cross[lines[mode][]];
for(int i=;i<;i++)cross[lines[mode][i]]=cross[lines[mode][i+]];
cross[lines[mode][]]=le;
return ;
}
int dfs(int dpt,int dptm){
if(dpt==dptm) return check();
if(dpt+predict()>dptm) return ;
for(int i=;i<;i++){
ans[dpt]=i+'A';
rotate(i);
if(dfs(dpt+,dptm)) return ;
if(i%==) rotate((i+)%);
else rotate((i+)%);
}
return ;
}
int main(){
while(scanf("%d",&cross[])!=EOF&&cross[]!=){
for(int i=;i<;i++) scanf("%d",&cross[i]);
if(check()) printf("No moves needed\n");
else{
int i=;
while(++i) if(dfs(,i)) break;
ans[i]='\0';
printf("%s\n",ans);
}
printf("%d\n",cross[matrix[]]);
}
return ;
}
[poj2286]The Rotation Game (IDA*)的更多相关文章
- POJ2286 The Rotation Game[IDA*迭代加深搜索]
The Rotation Game Time Limit: 15000MS Memory Limit: 150000K Total Submissions: 6325 Accepted: 21 ...
- POJ2286 The Rotation Game(IDA*)
The Rotation Game Time Limit: 15000MS Memory Limit: 150000K Total Submissions: 5691 Accepted: 19 ...
- HUD 1043 Eight 八数码问题 A*算法 1667 The Rotation Game IDA*算法
先是这周是搜索的题,网站:http://acm.hdu.edu.cn/webcontest/contest_show.php?cid=6041 主要内容是BFS,A*,IDA*,还有一道K短路的,.. ...
- POJ2286 The Rotation Game
Description The rotation game uses a # shaped board, which can hold 24 pieces of square blocks (see ...
- 7-12 The Rotation Game IDA*
状态搜索题目 一开始打算用bfs 但是图给的不是矩形图 有点难以下手 参考了 lrj 将图上所有的点进行标号 直接一个一维数组就解决了图的问题 并且明确了每个点的标号 处理起来十分方 ...
- hdu 1667 The Rotation Game ( IDA* )
题目大意: 给你一个“井”子状的board,对称的由24个方块组成,每个方块上有123三个数字中的一个.给你初始状态,共有八种变换方式,求字典序最小的最短的的变换路径使得,board中间的八个方块上数 ...
- POJ 2286 The Rotation Game IDA*
(再一次感谢学长幻灯片) ID A* 随便自己yy了一下. 额嗯 思路什么的都没有问题 就是改不对.. 无奈地删代码...边删边交. 删啊删 哎呦 AC了 ... ... ... 找删的那一段 . o ...
- A*专题训练
POJ2449 Remmarguts' Date UDF's capital consists of N stations. The hall is numbered S, while the sta ...
- 启发式搜索——A*算法
启发式搜索 启发式搜索是一种对搜索到的每一个位置进行评估,然后从评估的最优位置进行搜索直到目的地, 由于搜索时对每一个位置的评估是基于直观或经验的所有叫启发式搜索 A*算法 历史: 1964年Nils ...
随机推荐
- PBOC APDU命令解析【转】
转自:http://blog.csdn.net/zuokong/article/details/49335257 版权声明:本文为博主原创文章,未经博主允许不得转载. 应用层发出的命令报文和卡片回送到 ...
- grads 绘制仿matlab色标效果
http://bbs.06climate.com/forum.php?mod=viewthread&tid=38391&page=1#pid530730
- shell获取目录下最新的文件,文件是以日期命名
如果你为每个文件按日期命名的格式都一致的话,那么 "ls -l" 命令列出的文件列表就是默认按文件名称(日期先后)排序的.那么最后一个就是最新的,文件名可以用以下方式获取.file ...
- Windows通过DOS命令进入MYSQL的方法
例:MYSQL安装在 D:\ApacheServer\mysql 下 开始==>运行==>cmd,或者 按住win键+r键输入cmd C:\Users\Administrator>d ...
- ACM题目————数独
描述 数独是一种运用纸.笔进行演算的逻辑游戏.玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个3*3宫内的 数字均含1-9,不重复. 每一道合格的数独谜题都有 ...
- poj1811 Prime Test
http://poj.org/problem?id=1811 #include <cstdio> #include <cstring> #include <algorit ...
- LinkedList的实现原理
转载:http://wiki.jikexueyuan.com/project/java-collection/linkedlist.html 概述 LinkedList 和 ArrayList 一样, ...
- ThreadLocal深入理解二
转载:http://doc00.com/doc/101101jf6 今天在看之前转载的博客:ThreadLocal的内部实现原理.突然有个疑问, 按照threadLocal的原理, 当把一个对象存入到 ...
- 2016年12月5日 星期一 --出埃及记 Exodus 20:26
2016年12月5日 星期一 --出埃及记 Exodus 20:26 And do not go up to my altar on steps, lest your nakedness be exp ...
- C#和SQl 注入字符串的攻击 和 防止注入字符转的攻击
--SQl中 --建立ren的数据库,插入一条信息 create database ren go use ren go create table xinxi ( code ) primary key, ...