POJ 2286 The Rotation Game(IDA*)
| Time Limit: 15000MS | Memory Limit: 150000K | |
| Total Submissions: 6396 | Accepted: 2153 |
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 2286
第一道IDA*题目,由于用的是递归的写法,代码量实际上不会很大,只要在dfs入口处做好各种判断就可以了 ,能用IDA*的前提至少答案要存在,如果不存在的话搜索深度会无限加深就没有意义了,然后每一次都用估价函数剪枝即可,再加一个防止来回的剪枝速度可以快一倍
大致伪代码如下:
void dfs(state, dep)
{
计算此时状态下的估价函数值h(state)
if(h(state)==0)
已到终点,返回true
else if(h(state)+dep>Maxdep)
在规定的Maxdep内一定走不到终点,返回false
else
{
for....
{
得到新状态n_state
if(dfs(n_state,dep))
return 1;
}
}
return 0;
}
代码:
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <sstream>
#include <numeric>
#include <cstring>
#include <bitset>
#include <string>
#include <deque>
#include <stack>
#include <cmath>
#include <queue>
#include <set>
#include <map>
using namespace std;
#define INF 0x3f3f3f3f
#define LC(x) (x<<1)
#define RC(x) ((x<<1)+1)
#define MID(x,y) ((x+y)>>1)
#define CLR(arr,val) memset(arr,val,sizeof(arr))
#define FAST_IO ios::sync_with_stdio(false);cin.tie(0);
typedef pair<int, int> pii;
typedef long long LL;
const double PI = acos(-1.0);
const int N = 25; int arr[N], cnt[4];
int Max_dep, Num;
char ans[1000];
int top,Back[8]={5,4,7,6,1,0,3,2};//Back数组,减掉正拉动后又马上反向拉动的无意义搜索 int pos[8][7] =
{
{1, 3, 7, 12, 16, 21, 23}, //A0
{2, 4, 9, 13, 18, 22, 24}, //B1
{11, 10, 9, 8, 7, 6, 5}, //C2
{20, 19, 18, 17, 16, 15, 14}, //D3
{24, 22, 18, 13, 9, 4, 2},//E4
{23, 21, 16, 12, 7, 3, 1},//F5
{14, 15, 16, 17, 18, 19, 20},//G6
{5, 6, 7, 8, 9, 10, 11},//H7
};
int Need(int cur[])
{
int i;
cnt[1] = cnt[2] = cnt[3] = 0;
for (i = 7; i <= 9; ++i)
++cnt[cur[i]];
for (i = 12; i <= 13; ++i)
++cnt[cur[i]];
for (i = 16; i <= 18; ++i)
++cnt[cur[i]];
int Need_1 = 8 - cnt[1], Need_2 = 8 - cnt[2], Need_3 = 8 - cnt[3];
int Min_Need = min(Need_1, min(Need_2, Need_3));
return Min_Need;
}
int IDA_star(int dep, int Arr[],int pre)
{
int Need_cur = Need(Arr);
if (Need_cur == 0)
{
Num = Arr[7];
return 1;
}
if (Need_cur + dep > Max_dep)
return 0;
int Temp_arr[N]; for (int Opsid = 0; Opsid < 8; ++Opsid)
{
if(Opsid==pre)
continue;
ans[top++] = 'A' + Opsid; for (int i = 1; i <= 24; ++i)
Temp_arr[i] = Arr[i];
for (int i = 0; i < 7; ++i)
Temp_arr[pos[Opsid][i]] = Arr[pos[Opsid][(i + 1) % 7]]; if (IDA_star(dep + 1, Temp_arr, Back[Opsid]))
return 1;
else
--top;
}
return 0;
}
int main(void)
{
while (~scanf("%d", &arr[1]) && arr[1])
{
for (int i = 2; i <= 24; ++i)
scanf("%d", &arr[i]);
if (Need(arr) == 0)
{
puts("No moves needed");
printf("%d\n", arr[7]);
}
else
{
top = 0;
Max_dep = 1;
Num = -1;
while (!IDA_star(0, arr, -1))
++Max_dep;
ans[top] = '\0';
puts(ans);
printf("%d\n", Num);
}
}
return 0;
}
POJ 2286 The Rotation Game(IDA*)的更多相关文章
- POJ - 2286 - The Rotation Game (IDA*)
IDA*算法,即迭代加深的A*算法.实际上就是迭代加深+DFS+估价函数 题目传送:The Rotation Game AC代码: #include <map> #include < ...
- POJ2286 The Rotation Game(IDA*)
The Rotation Game Time Limit: 15000MS Memory Limit: 150000K Total Submissions: 5691 Accepted: 19 ...
- UVA-1343 The Rotation Game (IDA*)
题目大意:数字1,2,3都有八个,求出最少的旋转次数使得图形中间八个数相同.旋转规则:对于每一长行或每一长列,每次旋转就是将数据向头的位置移动一位,头上的数放置到尾部.若次数相同,则找出字典序最小旋转 ...
- 【UVa】1343 The Rotation Game(IDA*)
题目 题目 分析 lrj代码.... 还有is_final是保留字,害的我CE了好几发. 代码 #include <cstdio> #include <algorit ...
- POJ 1979 Red and Black (红与黑)
POJ 1979 Red and Black (红与黑) Time Limit: 1000MS Memory Limit: 30000K Description 题目描述 There is a ...
- POJ 3268 Silver Cow Party (最短路径)
POJ 3268 Silver Cow Party (最短路径) Description One cow from each of N farms (1 ≤ N ≤ 1000) convenientl ...
- POJ.3087 Shuffle'm Up (模拟)
POJ.3087 Shuffle'm Up (模拟) 题意分析 给定两个长度为len的字符串s1和s2, 接着给出一个长度为len*2的字符串s12. 将字符串s1和s2通过一定的变换变成s12,找到 ...
- POJ.1426 Find The Multiple (BFS)
POJ.1426 Find The Multiple (BFS) 题意分析 给出一个数字n,求出一个由01组成的十进制数,并且是n的倍数. 思路就是从1开始,枚举下一位,因为下一位只能是0或1,故这个 ...
- Booksort POJ - 3460 (IDA*)
Description The Leiden University Library has millions of books. When a student wants to borrow a ce ...
随机推荐
- AngularJs学习笔记-表单处理
表单处理 (1)Angular表单API 1.模板式表单,需引入FormsModule 2.响应式表单,需引入ReactiveFormsModule (2)模板式表单 在Angular中使用for ...
- tk.mybatis Example 多个or条件拼接
//需要的查询条件为 a and (b or c or d) 可以转换为 (a and b) or (a and c) or (a and d) private Example madeExample ...
- 【DBA-Oracle】更改Oracle数据字符集_转为常用的ZHS16GBK
A.oracle server 端 字符集查询 select userenv('language') from dual 其中NLS_CHARACTERSET 为server端字符集 NLS_LAN ...
- Oracle Hint 之 Append
1 描述 所谓直接路径操作,就是绕过buffer cache,直接将数据插入到表所在的数据文件中: 假如有表A,要将A中的数据插入到表B,在普通的间接插入下,先将A中的数据块传进buffer cach ...
- 【C++学习笔记】强大的算法——spfa
spfa的定义 PFA算法的全称是:Shortest Path Faster Algorithm,用于求单源最短路,由西南交通大学段凡丁于1994年发表.当给定的图存在负边时,Dijkstra算法就无 ...
- 简单的Maven+SpringMVC
一.SpringMVC非注解编程 1:修改pom.xml文件(相当于非Maven项目的导入jar包) <!-- https://mvnrepository.com/artifact/org.sp ...
- zabbix 密码忘记了如何恢复
1.进入数据库 2.使用zabbix的数据库 use zabbix: 3.查看表信息 show tables; 4.搜索users表 select * from users; 5.修改userid为1 ...
- mysql 删除 一天前 创建 的数据,计算时间差
DELETE from table_name WHERE TIMESTAMPDIFF(SECOND ,CREATE_TIME,now() ) > 24*60*60 https://www.cnb ...
- 十一、MySQL 插入数据
MySQL 插入数据 MySQL 表中使用 INSERT INTO SQL语句来插入数据. 你可以通过 mysql> 命令提示窗口中向数据表中插入数据,或者通过PHP脚本来插入数据. 语法 以下 ...
- 二、MySQL 管理
MySQL 管理 启动及关闭 MySQL 服务器 Windows 系统下 在 Windows 系统下,打开命令窗口(cmd),进入 MySQL 安装目录的 bin 目录. 启动: cd c:/mysq ...