UVA 1343 - The Rotation Game-[IDA*迭代加深搜索]
解题思路:
这是紫书上的一道题,一开始笔者按照书上的思路采用状态空间搜索,想了很多办法优化可是仍然超时,时间消耗大的原因是主要是:
1)状态转移代价很大,一次需要向八个方向寻找;
2)哈希表更新频繁;
3)采用广度优先搜索结点数越来越多,耗时过大;
经过简单计算,最长大概10次左右的变换就能出解,于是笔者就尝试采用IDA*,迭代加深搜索的好处是:
1)无需存储状态,节约时间和空间;
2)深度优先搜索查找的结点数少;
3)递归方便剪枝;
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <ctime> using namespace std;
8
#define time_ printf("time :%f\n",double(clock())/CLOCKS_PER_SEC)
#define maxs 735471
typedef int state[];
int init_p[];
state start;
int num;
int seq[maxs];
int cur;
char P1[maxs];
int maxd;
inline void get_P(char *P){
for(int i=;i<cur;i++)
P[i]=seq[i]+'A';
}
int pos[][]={
{,,,,,,},
{,,,,,,},
{,,,,,,},
{,,,,,,},
{,,,,,,},
{,,,,,,},
{,,,,,,},
{,,,,,,}
};
int tar[]={,,,,,,,}; inline int tar_num(const state &p){
int cnt=;
for(int k=;k<=;k++){
int c=;
for(int i=;i<;i++)
if(p[tar[i]]==k)
c++;
cnt=max(c,cnt);
}
return cnt;
}
inline void move(state& s,int i){
int temp=s[pos[i][]];
int j=;
for(;j<;j++)
s[pos[i][j]]=s[pos[i][j+]];
s[pos[i][j]]=temp;
}
bool dfs(state& u,int s_d){
if(s_d==maxd){
if(tar_num(u)==){
num=u[tar[]];
return true;
}
return false;
}
if(-tar_num(u)>maxd-s_d)
return false;
for(int i=;i<;i++){
move(u,i);
seq[cur++]=i;
if(dfs(u,s_d+))
return true;
cur--;
if(i%) move(u,(i+)%);
else move(u,(i+)%);
}
return false;
}
inline void init(){
memset(seq, -, sizeof seq);
cur=;
}
bool solve(){
init();
bool ok=false;
state u;
memcpy(u, init_p, sizeof u);
if(tar_num(u)==){
printf("‘No moves needed\n");
}
if(dfs(u,)){
ok=true;
get_P(P1);
}
return ok;
}
int main() { while(){
memset(P1, , sizeof P1);
for(int i=;i<;i++){
scanf("%d",&init_p[i]);
if(init_p[i]==) {
//time_;
return ;
}
}
state u;
memcpy(u, init_p, sizeof u);
if(tar_num(u)==){
printf("No moves needed\n%d\n",u[tar[]]);
continue;
}
for(maxd=;;maxd++)
if(solve())
break;
printf("%s\n%d\n",P1,num);
//time_;
}
return ;
}
UVA 1343 - The Rotation Game-[IDA*迭代加深搜索]的更多相关文章
- POJ2286 The Rotation Game[IDA*迭代加深搜索]
The Rotation Game Time Limit: 15000MS Memory Limit: 150000K Total Submissions: 6325 Accepted: 21 ...
- uva 11212 - Editing a Book(迭代加深搜索 IDA*) 迭代加深搜索
迭代加深搜索 自己看的时候第一遍更本就看不懂..是非常水,但智商捉急也是没有办法的事情. 好在有几个同学已经是做过了这道题而且对迭代加深搜索的思路有了一定的了解,所以在某些不理解的地方询问了一下他们的 ...
- HDU 1560 DNA sequence (IDA* 迭代加深 搜索)
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1560 BFS题解:http://www.cnblogs.com/crazyapple/p/321810 ...
- UVA - 11214 Guarding the Chessboard(迭代加深搜索)
题目: 输入一个n*m的棋盘(n,m<10),某些格子有标记,用最少的皇后守卫(即占据或攻击)所有的标记的格子.输出皇后的个数. 思路: 一开始没有想到用迭代加深搜索,直接dfs结果还没写完就发 ...
- UVA 11212 Editing a Book [迭代加深搜索IDA*]
11212 Editing a Book You have n equal-length paragraphs numbered 1 to n. Now you want to arrange the ...
- 埃及分数 迭代加深搜索 IDA*
迭代加深搜索 IDA* 首先枚举当前选择的分数个数上限maxd,进行迭代加深 之后进行估价,假设当前分数之和为a,目标分数为b,当前考虑分数为1/c,那么如果1/c×(maxd - d)< a ...
- BZOJ1085: [SCOI2005]骑士精神 [迭代加深搜索 IDA*]
1085: [SCOI2005]骑士精神 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1800 Solved: 984[Submit][Statu ...
- UVA 529 - Addition Chains,迭代加深搜索+剪枝
Description An addition chain for n is an integer sequence with the following four properties: a0 = ...
- 7-10Editing aBook uva11212(迭代加深搜索 IDA*)
题意: 给出n( 2<=n<=9) 个乱序的数组 要求拍成升序 每次 剪切一段加上粘贴一段算一次 拍成1 2 3 4 ...n即可 求排序次数 典型的状态空间搜索问题 ...
随机推荐
- pygame-常用的方法
1.pygame常用的方法 2.语音 图片
- dingo/api 使用 知识
Dingo 能为Laravel提供一整套包括从路由,到认证的RESTful API开发工具 Laravel & Lumen RESTFul API 扩展包:Dingo API(一) —— 安装 ...
- 转载 初探Promise
初探Promise https://segmentfault.com/a/1190000007032448 javascript es6 promise 33.5k 次阅读 · 读完需要 65 分 ...
- MSSQL → 01:SQLServer 2008概述及安装
据库的发展史 在人类诞生以来,就有记录数据的需求,在远古时代就有了结绳记事的故事,而随着科技的进步,我们记录数据的方式也发生了天翻地覆的变化,从效率低.规模小.不能适应信息高速发展的需要的手工或者简单 ...
- Directx11教程(16) D3D11管线(5)
原文:Directx11教程(16) D3D11管线(5) 本章我们学习VS中具体做些什么事情? 首先再看看我们的VS shader代码: Clolor.vs - PixelInputType Col ...
- 洛谷 P1119 灾后重建 最短路+Floyd算法
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 总结 题面 题目链接 P1119 灾后重建 题目描述 B地区在地震过后,所有村 ...
- PLAY2.6-SCALA(六) 异步处理结果
1.创建异步的controller Play是一个自底向上的异步框架,play处理所有的request都是异步.非阻塞的.默认的方式是使用异步的controller.换句话说,contrller中的应 ...
- nodeJs学习-13 router
const express=require('express'); var server=express(); //目录1:/user/ var routeUser=express.Router(); ...
- Linux使用及命令
#命令模式下输入:光标移动到第34行第15个字符 <Enter>15l(这是小写的L) ctrl+u删除光标前面的字符 ctrl+j删除光标后面的字符 在Linux下用VIM打开大小几个G ...
- Java中try catch finally语句中含return语句的执行情况总结-编程陷阱
前言:有java编程基础的人对java的异常处理机制都会有一定了解,而且可能感觉使用起来也比较简单,但如果在try catch finally语句块中遇到return语句,开发者可能就会遇到一些逻辑问 ...