POJ - 2286 - The Rotation Game (IDA*)
IDA*算法,即迭代加深的A*算法。实际上就是迭代加深+DFS+估价函数
题目传送:The Rotation Game
AC代码:
#include <map>
#include <set>
#include <list>
#include <cmath>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <cctype>
#include <cstdio>
#include <string>
#include <vector>
#include <complex>
#include <cstdlib>
#include <cstring>
#include <fstream>
#include <sstream>
#include <utility>
#include <iostream>
#include <algorithm>
#include <functional>
#define LL long long
#define INF 0x7fffffff
using namespace std;
int mp[25];
int n;
int pos[] = {7, 8, 9, 12, 13, 16, 17, 18};
int depth;
int ans_num;
char ans[205];
bool is_ok(int *g) {//推断是否已达到结果
int t = g[7];
if(t == g[8] && t == g[9] && t == g[12] && t == g[13] && t == g[16] && t == g[17] && t == g[18]) {
return true;
}
return false;
}
void change_state(int *g, int a1, int a2, int a3, int a4, int a5, int a6, int a7) {//状态转换(这里就是数字移位)
int tmp = g[a1];
g[a1] = g[a2]; g[a2] = g[a3]; g[a3] = g[a4];
g[a4] = g[a5]; g[a5] = g[a6]; g[a6] = g[a7];
g[a7] = tmp;
}
int get_maxnum(int *g) {//获取中间8个数之间出现次数最大的那个数的次数
int cnt[4];
cnt[1] = cnt[2] = cnt[3] = 0;
for(int i = 0; i < 8; i ++) {
cnt[g[pos[i]]] ++;
}
return max(cnt[1], max(cnt[2], cnt[3]));
}
//IDA*算法的核心即为DFS+迭代加深+估价函数
int dfs(int *g, int cur_depth, int pre_dir) {
if(depth - cur_depth < 8 - get_maxnum(g)) { //相似于估价函数,此处由于每次数字移位最多仅仅能使得中间的数字多一个一样的。
return 0; //而每次搜索相应一次数字移位。而当搜索次数小于8个数中要改变得几个数时。肯定不正确。
剪枝①
}
if(cur_depth >= depth) {//迭代加深搜索的精髓
return 0;
}
int tmp[25];
for(int i = 1; i <= 8; i ++) {//往八个方向搜索
if((i == 1 && pre_dir == 6) || (i == 6 && pre_dir == 1)) continue;//下面都是减去和前一个移位的方向相反方向的情况。剪枝②
if((i == 2 && pre_dir == 5) || (i == 5 && pre_dir == 2)) continue;
if((i == 3 && pre_dir == 8) || (i == 8 && pre_dir == 3)) continue;
if((i == 4 && pre_dir == 7) || (i == 7 && pre_dir == 4)) continue;
for(int j = 1; j <= 24; j ++) tmp[j] = g[j];
switch(i) {
case 1: ans[cur_depth] = 'A'; change_state(tmp, 1, 3, 7, 12, 16, 21, 23); break;
case 2: ans[cur_depth] = 'B'; change_state(tmp, 2, 4, 9, 13, 18, 22, 24); break;
case 3: ans[cur_depth] = 'C'; change_state(tmp, 11, 10, 9, 8, 7, 6, 5); break;
case 4: ans[cur_depth] = 'D'; change_state(tmp, 20, 19, 18, 17, 16, 15, 14); break;
case 5: ans[cur_depth] = 'E'; change_state(tmp, 24, 22, 18, 13, 9, 4, 2); break;
case 6: ans[cur_depth] = 'F'; change_state(tmp, 23, 21, 16, 12, 7, 3, 1); break;
case 7: ans[cur_depth] = 'G'; change_state(tmp, 14, 15, 16, 17, 18, 19, 20); break;
case 8: ans[cur_depth] = 'H'; change_state(tmp, 5, 6, 7, 8, 9, 10, 11); break;
}
if(is_ok(tmp)) {
ans_num = tmp[7];
ans[cur_depth + 1] = '\0';
return 1;
}
if(dfs(tmp, cur_depth + 1, i)) return 1;
}
return 0;
}
int main() {
int x;
while(1) {
scanf("%d", &mp[1]);
if(mp[1] == 0) {
break;
}
for(int i = 2; i <= 24; i ++) {
scanf("%d", &mp[i]);
}
if(is_ok(mp)) {
printf("No moves needed\n");
printf("%d\n", mp[7]);
continue;
}
depth = 1;
while(1) {
if(dfs(mp, 0, -1)) {
break;
}
depth ++;
}
printf("%s\n", ans);
printf("%d\n", ans_num);
}
return 0;
}
POJ - 2286 - The Rotation Game (IDA*)的更多相关文章
- POJ 2286 The Rotation Game(IDA*)
The Rotation Game Time Limit: 15000MS Memory Limit: 150000K Total Submissions: 6396 Accepted: 21 ...
- 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 ...
随机推荐
- java byte中存大于0x7E的十六进制数
在做一个Android app和arm板子交互的程序中,遇到一个问题,Java byte中无法直接存储大于0x7E的十六进制,但是C语言却可以. 出现这个状况的原因是:Java中是byte存储的是有符 ...
- *android抓包工具——fiddler抓包分析api接口
本文地址:http://blog.csdn.net/u011733020 首先,写这个仅仅是为了学习.不是要做什么违法的事情,假设有问题,有关部门 请联系我,立刻删除. 不要查我水表. 正题:这里介绍 ...
- cocos2d-x 一些3效果的类及创建參数
CCShaky3D::create(时间,晃动网格大小,晃动范围,Z轴是否晃动); //创建一个3D晃动的效果 CCShakyTiles3D::create(时间,晃动网格大小,晃动范围,Z轴是否晃动 ...
- Objective-C基础笔记(1)基本概念和第一个程序
一.基本概念 Objective-C(简称OC)是iOS开发的核心语言,苹果公司在维护,在开发过程中也会配合着使用C语言.C++,OC主要负责UI界面,C语言.C++可用于图形处理.C语言是面向过程的 ...
- 不用浏览器,直接用代码发送文件给webservices所在服务器 并且可以周期行的发送
package com.toic.test; import java.io.DataInputStream; import java.io.DataOutputStream; import java. ...
- POJ 1118 Lining Up 直线穿过最多的点数
http://poj.org/problem?id=1118 直接枚举O(n^3) 1500ms能过...数据太水了...这个代码就不贴了... 斜率排序O(n^2logn)是更好的做法...枚举斜率 ...
- HDU 2281 Square Number Pell方程
http://acm.hdu.edu.cn/showproblem.php?pid=2281 又是一道Pell方程 化简构造以后的Pell方程为 求出其前15个解,但这些解不一定满足等式,判断后只有5 ...
- 推广一下新Blog www.hrwhisper.me
新博客地址:www.hrwhisper.me 欢迎互访加友链~
- 【Codeforces Round #429 (Div. 2) A】Generous Kefa
[Link]:http://codeforces.com/contest/841/problem/A [Description] [Solution] 模拟,贪心,每个朋友尽量地多给气球. [Numb ...
- MySQL 5.7 多实例安装部署实例
1. 背景 MySQL数据库的集中化运维,可以通过在一台服务器上,部署运行多个MySQL服务进程,通过不同的socket监听不同的服务端口来提供各自的服务.各个实例之间是相互独立的,每个实例的dat ...