UVA 11212 IDA*
移动一块连续的区间使得数列递增。问最少次数。
直接IDA*暴搜,只是我没有想到A*函数,所以就随手写了个连续递增块数作为估价函数,WA了,然后除以2,还是WA,除以3,WA,除以4.。。过了= =
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<list>
#include<algorithm>
using namespace std;
#define stop system("pause")
int n,a[20],lim;
void print(int *a){for(int i=1;i<=n;i++) printf("%d ",a[i]);puts("");}
int h(int *s)
{
int cnt=0;
for(int i=1;i<n;i++)
if(s[i]+1!=s[i+1])
cnt++;
if(s[n]!=n) cnt++;
return cnt/4;
}
bool change(int from,int ed,int to,int *s)
{
if(to>=from-1&&to<=ed) return false;
int next[20],tmp[20];
for(int i=0;i<=n;i++) tmp[i]=s[i],next[i]=i+1;
next[from-1]=ed+1;
next[to]=from;
next[ed]=to+1;
for(int i=next[0],cnt=1;cnt<=n;i=next[i],cnt++)
{
s[cnt]=tmp[i];
}
return true;
}
bool over(int *a)
{
for(int i=1;i<=n;i++) if(a[i]!=i) return false;
return true;
}
bool dfs(int dep,int *s)
{
if(over(s)) return true;
if(dep>=lim) return false;
if(dep+h(s)>=lim) return false;
for(int from=1;from<=n;from++)
{
for(int ed=from;ed<=n;ed++)
{
for(int to=0;to<=n;to++)
{
int tmp[15];
memcpy(tmp,s,sizeof(int)*(n+1));
if(change(from,ed,to,tmp)==0) continue;
if(dfs(dep+1,tmp)) return true;
}
}
}
return false;
}
int main()
{
int ca=1;
while(~scanf("%d",&n))
{
if(n==0) break;
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(lim=h(a);!dfs(0,a);lim++) ;
printf("Case %d: %d\n",ca++,lim);
}
return 0;
}
/*
9
9 8 7 6 5 4 3 2 1
*/
貌似正解应该是 dep*3+h()>lim*3
UVA 11212 IDA*的更多相关文章
- Editing a Book UVA - 11212 IDA*
You have n equal-length paragraphs numbered 1 to n . Now you want to arrange them in the order of 1 ...
- 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 ...
- UVa 11212 编辑书稿(dfs+IDA*)
https://vjudge.net/problem/UVA-11212 题意:给出n个自然段组成的文章,将他们排列成1,2...,n.每次只能剪切一段连续的自然段,粘贴时按照顺序粘贴. 思路:状态空 ...
- UVA - 11212 Editing a Book (IDA*)
给你一个长度为n(n<=9)的序列,每次可以将一段连续的子序列剪切到其他地方,问最少多少次操作能将序列变成升序. 本题最大的坑点在于让人很容易想到许多感觉挺正确但实际却不正确的策略来避开一些看似 ...
- UVA - 11212 Editing a Book (IDA*搜索)
题目: 给出n(1<n<10)个数字组成的序列,每次操作可以选取一段连续的区间将这个区间之中的数字放到其他任意位置.问最少经过多少次操作可将序列变为1,2,3……n. 思路: 利用IDA* ...
- UVa 11212 Editing a Book (IDA* && 状态空间搜索)
题意:你有一篇n(2≤n≤9)个自然段组成的文章,希望将它们排列成1,2,…,n.可以用Ctrl+X(剪切)和Ctrl+V(粘贴)快捷键来完成任务.每次可以剪切一段连续的自然段,粘贴时按照顺序粘贴.注 ...
- UVA - 11212 Editing a Book(IDA*算法+状态空间搜索)
题意:通过剪切粘贴操作,将n个自然段组成的文章,排列成1,2,……,n.剪贴板只有一个,问需要完成多少次剪切粘贴操作可以使文章自然段有序排列. 分析: 1.IDA*搜索:maxn是dfs的层数上限,若 ...
- uva 11212 - Editing a Book(迭代加深搜索 IDA*) 迭代加深搜索
迭代加深搜索 自己看的时候第一遍更本就看不懂..是非常水,但智商捉急也是没有办法的事情. 好在有几个同学已经是做过了这道题而且对迭代加深搜索的思路有了一定的了解,所以在某些不理解的地方询问了一下他们的 ...
- UVA 11212 Editing a Book
题意: 有一篇由n个自然段组成的文章.希望将他们排成递增序列.只能剪贴和粘贴交替进行,剪贴时可以剪贴一段连续的自然段. 分析: 用IDA*算法求解.当3*d+h>maxd时剪枝. 代码: #in ...
随机推荐
- SGU 123.The sum
#include <iostream> using namespace std; int f[50]={0,1,1}; int main(){ int n,s=0; cin>> ...
- 第八篇、SVN在Mac上使用
Mac自带svn软件 1.创建目录 svn-repository/source-code 2.svnadmin create /Users/liaokailin/svn-repository/sour ...
- JS判断浏览器是否支持某一个CSS3属性的方法
var div = document.createElement('div'); console.log(div.style.transition); //如果支持的话, 会输出 "&quo ...
- Idea中运行Testng时,报SAXParseException:parallel为none的问题原因及解决
今天更新了testng的版本为6.9.10, 在idea中运行测试案例时,报错如下: org.testng.TestNGException: org.xml.sax.SAXParseException ...
- ICE学习第二步-----从第一个程序了解ICE(HelloWorld)
ICE(Internet Communications Engine)是一种面向对象的中间件平台,主要用于网络通讯.它为面向对象的“客户端-服务器”模型的应用提供了一组很好的工具和API接口.目前在全 ...
- 知识备忘phpcms 简单解析一 数据表字段
PHPCMS V9帮助中心 数据结构 phpcms v9 数据... phpcms v9 数据... PHPSSO 数据库结... phpcms v9 数据表结构 在线版 PHPCMS V9 数据结构 ...
- 如何在Android Studio中使用Gradle发布项目至Jcenter仓库
简述 目前非常流行将开源库上传至Jcenter仓库中,使用起来非常方便且易于维护,特别是在Android Studio环境中,只需几步配置就可以轻松实现上传和发布. Library的转换和引用 博主的 ...
- Adobe Photoshop CS或者CC卸载不了怎么办?
有木有没有遇到这个问题的同学?使用Adobe Creative Suite CleanerToo工具下载就好了~ 下载地址:http://pan.baidu.com/s/1pJ3aBsn
- Spring 配置自动扫描spring bean配置
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w ...
- oracle利用merge更新一表的某列数据到另一表中
假设你有两张表 t1 表 -------------------------- id | name | pwd 1 | n1 | t2 表 ------------- ...