[2016-02-27][UVA][11212][Editing a Book]

[2016-02-27][UVA][11212][Editing a Book]

  • 时间:2016-02-26 19:38:44 星期五
  • 题目编号:UVA 11212
  • 题目大意:给定长度为n(值为1~n)的序列,求把该序列 复制/粘贴 成1~n 的排列最少步数
  • 分析:
    • 状态空间搜索,但是每次状态转移的方式有多种,可能会T,
    • 发现,最多 操作 的次数:n~1的序列,每次操作 长度为1的连续段,那么需要 n-1 次操作
    • 可以用IDA*算法
    • 剪枝,每次操作之后,每个数字的后继数字不正确的数目h,最多减少3,
    • 那么至少需要 h / 3 次操作才能,达到目标
  • 方法:IDA*
    • 数据是10个长度,所以,结贴操作直接for语句完成      
    • dfs过程,层数达到maxd,判断是否排列好
    • 如果预测最少层数大于maxd,直接返回
    • dfs ,枚举起点和宽度,截取这一段数字,放在起点前面任意一个点,然后进入下层dfs



#include <vector>

#include <list>

#include <map>

#include <set>

#include <deque>

#include <queue>

#include <stack>

#include <bitset>

#include <algorithm>

#include <functional>

#include <numeric>

#include <utility>

#include <sstream>

#include <iostream>

#include <iomanip>

#include <cstdio>

#include <cmath>

#include <cstdlib>

#include <cctype>

#include <string>

#include <cstring>

#include <cstdio>

#include <cmath>

#include <cstdlib>

#include <ctime>

using namespace std;

typedef long long LL;

#define CLR(x,y) memset((x),(y),sizeof((x)))

#define FOR(x,y,z) for(int (x)=(y);(x)<(z);++(x))

#define FORD(x,y,z) for(int (x)=(y);(x)>=(z);--(x))

#define FOR2(x,y,z) for((x)=(y);(x)<(z);++(x))

#define FORD2(x,y,z) for((x)=(y);(x)>=(z);--(x))

const int maxn = 11;

int x[maxn],n,a[maxn];

int is_sorted(){

FOR(i,0,n)

if(a[i] != i + 1)       return 0;

return 1;

}

int h(){

int cnt = 0;

FOR(i,0,n - 1){

if(a[i] + 1 != a[i + 1])

++cnt;

}

return cnt;

}

int dfs(int curcnt,int & maxd){

//成功返回1,同时结束bfs

if(curcnt == maxd)      return is_sorted();

//超过范围

if(curcnt*3 + h() > 3 * maxd)   return 0;

int tmp[maxn];

memcpy(tmp,a,sizeof(int)*n);

FOR(i,1,n){//枚举长度

for(int j = 0; i + j - 1 < n;++j){//枚举起点

//剪切 区段

int t1[maxn],t2[maxn],c1 = -1,c2 = -1;

FOR(k,0,n){

if( k >= j && k < i + j)  t1[++c1] = tmp[k];

else t2[++c2] = tmp[k];

}

//粘贴区段

FOR(k,0,j){

int c = -1;

FOR(l,0,k)      a[++c] = t2[l];

FOR(l,0,c1+1)     a[++c] = t1[l];

FOR(l,k,c2+1)     a[++c] = t2[l];

//进入下层dfs

if(dfs(curcnt + 1,maxd))        return 1;

}

}

}

return 0;

}

int main(){

int cntcase = 0;

while(~scanf("%d",&n) && n){

FOR(i,0,n)      scanf("%d",x+i);

int i;

//枚举步骤数目,

for(i = 0;;++i){

memcpy(a,x,sizeof(int)*n);

if(dfs(0,i))    break;

}

printf("Case %d: %d\n",++cntcase,i);

}

return 0;

}  



来自为知笔记(Wiz)

时间: 2024-10-15 07:54:46

[2016-02-27][UVA][11212][Editing a Book]的相关文章

uva 11212 - Editing a Book(迭代加深搜索 IDA*) 迭代加深搜索

迭代加深搜索 自己看的时候第一遍更本就看不懂..是很水,但智商捉急也是没有办法的事情. 好在有几个同学已经是做过了这道题并且对迭代加深搜索的思路有了一定的了解,所以在某些不理解的地方询问了一下他们的见解, 真的是很有帮助,也许自己想要想很久才能想明白,还会很痛苦,稍微问一下别人的想法,点上一个方向,剩下的自己就能想得明白了. 迭代加深. 把answer(需要的步数或其他)在主函数里面从零往上递加,此之谓 "层数",亦可谓之"深度".用书上的话就是: 从小到大枚举深度

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 them in the order of 1, 2, . . . , n. With the help of a clipboard, you can easily do this: Ctrl-X (cut) and Ctrl-V (paste) several times. You cannot cut

2016/02/27 codes

b2Math.b2Abs = function(a){return a > 0.0 ? a : -a ;};b2Math.b2AbsV = function(a){var b = new b2Vec2(b2Math.b2Abs(a.x),b2Math.b2Abs(a.y));return b};b2Math.b2AbsM=function(A){var B=new b2Mat22(0,b2Math.b2AbsV(A.col1),b2Math.b2AbsV(A.col2));return B;};

UVA 11212 Editing a Book

题意: 有一篇由n个自然段组成的文章.希望将他们排成递增序列.只能剪贴和粘贴交替进行,剪贴时可以剪贴一段连续的自然段. 分析: 用IDA*算法求解.当3*d+h>maxd时剪枝. 代码: #include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;string goal;int n;bool dfs(int d,int max

UVa 11212 Editing a Book (IDA* &amp;&amp; 状态空间搜索)

题意:你有一篇n(2≤n≤9)个自然段组成的文章,希望将它们排列成1,2,-,n.可以用Ctrl+X(剪切)和Ctrl+V(粘贴)快捷键来完成任务.每次可以剪切一段连续的自然段,粘贴时按照顺序粘贴.注意,剪贴板只有一个,所以不能连续剪切两次,只能剪切和粘贴交替.例如,为了将{2,4,1,5,3,6}变为升序,可以剪切1将其放到2前,然后剪切3将其放到4前.再如,排列{3,4,5,1,2},只需一次剪切和一次粘贴即可--将{3,4,5}放在{1,2}后,或者将{1,2}放在{3,4,5}前. 分析

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 ; 2 ;:::;n . With the help of a clipboard, you can easily do this: Ctrl-X (cut) and Ctrl-V (paste) several times. You cannot cut twice before pasting,

2016/02/21 codes

var Class = { create:function(){ var parent = null,properties = $A(arguments); if(Object.isFunction(properties[0])) parent = properties.shift(); function kclass(){ this.initialize.apply(this.arguments); } Object.extend(kclass,Class.Methods); kclass.s

FFMpeg ver 20160219-git-98a0053 滤镜中英文对照 2016.02.21 by 1CM

FFMpeg ver 20160219-git-98a0053 滤镜中英文对照 2016.02.21 by 1CM T.. = Timeline support 支持时间轴 .S. = Slice threading 分段线程 ..C = Command support 支持命令传送 A = Audio input/output 音频 输入/输出 V = Video input/output 视频 输入/输出 N = Dynamic number and/or type of input/out

2016/02/20 codes

<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"> <title>2016/02/20</title></head><body><div id="mainDiv"> <div id = "content"> <div id = &qu