【例题 7-10 UVA - 11212】Editing a Book
【链接】 我是链接,点我呀:)
【题意】
在这里输入题意
【题解】
迭代加深搜。
很容易想到,最多只要搜8层就可以得到答案了
->最多8下肯定可以还原。
则枚举一下最大层数。然后做个深搜就好。
优化。
设0..n每个数字的后继不为a[i]+1的个数为cnt
则每次操作显然最多只能减少3个cnt..
可以画图分析一下。
则可以拿这个来做剪枝。。
然后插入的过程可以用链表来实现。
【代码】
/*
1.Shoud it use long long ?
2.Have you ever test several sample(at least therr) yourself?
3.Can you promise that the solution is right? At least,the main ideal
4.use the puts("") or putchar() or printf and such things?
5.init the used array or any value?
6.use error MAX_VALUE?
7.use scanf instead of cin/cout?
8.whatch out the detail input require
*/
#include <bits/stdc++.h>
using namespace std;
const int N = 10;
int n,a[N+5],l[N+5],r[N+5],templ[N+5],tempr[N+5],maxdep,ans = -1;
void Move(int i,int j,int pos){
r[l[i]] = r[j];
l[r[j]] = l[i];
l[r[pos]] = j;
r[j] = r[pos];
r[pos] = i;
l[i] = pos;
}
void dfs(int dep){
if (dep==maxdep){
for (int i = 0;i <= n;i++)
if (a[r[i]]!=a[i]+1)
return;
if (ans==-1) ans = dep;
else ans = min(ans,dep);
return;
}
int cnt = 0;
for (int i = 0;i <= n;i++)
if (a[r[i]]!=a[i]+1)
cnt++;
int delta = maxdep-dep;
if (delta*3<cnt) return;
for (int i = r[0];i != n+1;i=r[i])
for (int j = i;j != n+1;j = r[j]){
//1,2,3..i..j,j+1....n
for (int pos = 0;pos!=l[i];pos=r[pos]){
int pre = l[i];
Move(i,j,pos);
dfs(dep+1);
Move(i,j,pre);
}
for (int pos = r[j];pos != n+1;pos = r[pos]){
int pre = l[i];
Move(i,j,pos);
dfs(dep+1);
Move(i,j,pre);
}
}
return;
}
int main(){
#ifdef LOCAL_DEFINE
freopen("F:\\c++source\\rush_in.txt", "r", stdin);
#endif
ios::sync_with_stdio(0),cin.tie(0);
int kase = 0;
while (cin >> n && n){
cout <<"Case "<<++kase<<": ";
for (int i = 1;i <= n;i++) cin >> a[i];
for (int i = 1;i <= n+1;i++) l[i] = i-1,r[i] = i+1;
r[0] = 1;
a[n+1] = n+1;
ans = -1;
for (maxdep = 0;maxdep <= 9;maxdep++){
dfs(0);
if (ans!=-1) break;
}
cout << ans << endl;
}
return 0;
}
【例题 7-10 UVA - 11212】Editing a Book的更多相关文章
- 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 Editing a Book (IDA*搜索)
题目: 给出n(1<n<10)个数字组成的序列,每次操作可以选取一段连续的区间将这个区间之中的数字放到其他任意位置.问最少经过多少次操作可将序列变为1,2,3……n. 思路: 利用IDA* ...
- UVA 11212 Editing a Book
题意: 有一篇由n个自然段组成的文章.希望将他们排成递增序列.只能剪贴和粘贴交替进行,剪贴时可以剪贴一段连续的自然段. 分析: 用IDA*算法求解.当3*d+h>maxd时剪枝. 代码: #in ...
- UVA - 11212 Editing a Book (IDA*)
给你一个长度为n(n<=9)的序列,每次可以将一段连续的子序列剪切到其他地方,问最少多少次操作能将序列变成升序. 本题最大的坑点在于让人很容易想到许多感觉挺正确但实际却不正确的策略来避开一些看似 ...
- uva 11212 - Editing a Book(迭代加深搜索 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的层数上限,若 ...
- 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*)
题目 题目 分析 get一下IDA*的技巧,感觉总体来说不难,主要是剪枝比较难想. 这是lrj的代码,比较通俗易懂,关键就是选定一个区间再取出来,插入到一个位置,接下来转移到这个状态. ...
随机推荐
- 联想 U410 超极本启用加速硬盘方法
安装步骤: 方法一: 使用raid1方法 (此方法未安装过) 方法二: 普通安装后,使用RST加速 1.改BIOS , 为AHCI启动 , 2.安装好系统后,下载RST软件并安装 3.改BIO ...
- 解决电信或网通的DNS劫持
大家有没有碰到访问一些不存在域名或者网站时,浏览器本应显示一个网址不存在之类的信息,但是因为现在很多ISP做了DNS劫持将不存在的域名或网址重定向到ISP的广告页面,烦人的狠.其实tomato可以解决 ...
- Python正则表达式初识(二)
前几天给大家分享了Python正则表达式初识(一),介绍了正则表达式中的三个特殊字符“^”.“.”和“*”,感兴趣的伙伴可以戳进去看看,今天小编继续给大家分享Python正则表达式相关特殊字符知识点. ...
- LRJ入门经典-0906最短公共父串305
原题 LRJ入门经典-0906最短公共父串305 难度级别:B: 运行时间限制:1000ms: 运行空间限制:256000KB: 代码长度限制:2000000B 试题描述 给定字符串A和字符串B,要求 ...
- Linux学习总结(6)——CenterOS7安装mysql5.5的方法
首先centos7 已经不支持mysql,因为收费了你懂得,所以内部集成了mariadb,而安装mysql的话会和mariadb的文件冲突,所以需要先卸载掉mariadb,以下为卸载mariadb,安 ...
- SQL脚本存在TABLE ACCESS FULL行为
对于SQL的执行计划,一般尽量避免TABLE ACCESS FULL的出现,那怎样去定位,系统里面哪些SQL脚本存在TABLE ACCESS FULL行为,对于9i及以后版本,使用以下语句即可 sel ...
- HypericHQ
https://sourceforge.net/projects/hyperichq-zh-cn/?source=typ_redirect
- ASP.NET中的几种弹出框提示
B/S不像C/S那样一个MessageBox就可以弹出提示框,不过可以通过js的“Alert”来弹出消息,或者通过一些变种的js方法.下面我给大家介绍几种,希望大家喜欢. 四种弹出框代码: prote ...
- HDU 5375 Gray code(DP)
题意:给一串字符串,里面可能出现0,1,?,当中问号可能为0或1,将这个二进制转换为格雷码后,格雷码的每位有一个权值,当格雷码位取1时.加上该位权值,求最大权值和为多少. 分析:比赛的时候愚了.竟然以 ...
- android 二次按返回键退出client
android中有的app退出client时弹出对话框的方法,有的是点击二次,第一次是提示用户是否退出client,第二次点击才是真正的退出app.这是用二次点击返回键的时间间隔推断, 今天就实现这简 ...