UVa11212
来源:互联网 发布:手机怎么备份所有数据 编辑:程序博客网 时间:2024/06/05 06:52
/*
迭代加深搜索经典问题,
迭代加深搜索的核心思想是通过不停加深搜索深度来控制解答树的深度和宽度,
对于这一类题目,如果使用DFS,则会因为第一个可行解的深度太大而导致爆栈,
因此搜索的对象是深度,通过控制深度,及时停止过深的搜索。
2.也是搜索问题的共性,就是要有剪枝,
寻找剪枝的方向是根据当前状态和剩下的可行步来计算最好情况下能否获得可行解,如果不行,那么就需要剪枝
3.这中间最主要的剪枝手段就是计算有多少逆序后继数,因为每一次移动一个数字最多使得逆序后继数减三,
因此如果逆序后继数h>3(maxd-d),就说明当前路径下,没有可行解,应剪枝。
*/
#include <iostream>
#include<cstdio>
#include<string>
#include<map>
#include<vector>
#include<sstream>
#include<string.h>
#include<algorithm>
#include<unordered_set>
#include<unordered_map>
#include<utility>
#include<cmath>
#include<time.h>
using namespace std;
int geth(vector<int>&nums){
int cnt=0;
for(int i=1;i<nums.size();++i){
if(nums[i-1]+1!=nums[i])++cnt;
}
return cnt;
}
bool dfs(int d,vector<int>&nums,int maxd){
int i=0,cnt=geth(nums);
if(cnt==0)return true;
if(cnt>3*(maxd-d))return false;
for(i=0;i<nums.size();){
int j=i+1;
while(j<nums.size()&&nums[j-1]+1==nums[j])++j;
for(;j<=nums.size();++j){
vector<int>tmp=nums,in(nums.begin()+i,nums.begin()+j);
tmp.erase(tmp.begin()+i,tmp.begin()+j);
vector<int>lhs=tmp,rhs=tmp;
auto lp=find(lhs.begin(),lhs.end(),in.front()-1);
auto rp=find(rhs.begin(),rhs.end(),in.back()+1);
lhs.insert(lp==lhs.end()?lp:next(lp),in.begin(),in.end());
rhs.insert(rp,in.begin(),in.end());
if(dfs(d+1,lhs,maxd)||dfs(d+1,rhs,maxd))return true;
}
++i;
while(i<nums.size()&&nums[i-1]+1==nums[i])++i;
}
return false;
}
int main()
{
int N,kase=0;
while(scanf("%d",&N)!=EOF&&N){
vector<int>nums(N+1,0);
for(int i=1;i<=N;++i)scanf("%d",&(nums[i]));
for(int maxd=0;;++maxd){
if(dfs(0,nums,maxd)){
printf("Case %d: %d\n",++kase,maxd);
break;
}
}
}
return 0;
}
阅读全文
0 0
- uva11212
- UVa11212
- UVa11212 - Editing a Book
- 例题7-10 编辑书稿 UVa11212
- uva 11212 UVa11212 Editing a Book
- UVa11212 编辑书稿(Editing a book)
- uva11212 编辑书稿 迭代加深
- UVA11212 Editing a Book (IDA*)
- Uva11212 编辑书稿(Editing a book,IDE算法)
- 紫书 例题7-10 编辑书稿 UVa11212 IDA*
- Uva11212 Editing a Book【IDA*】【例题7-10】
- 迭代加深搜索--IDA*--uva11212 Editing a book
- uva11212(Editing a Book/编辑书稿)=>IDA*算法/经典的估价函数
- Python-爬取自己博客文章的URL
- JAVA(一)
- C++:指针传递、引用传递的区别
- 如何理解并正确使用MySql索引
- 虚拟机的选用技巧
- UVa11212
- 浅谈&&和||的区别
- tcp缓冲区满的问题
- Codeforces Round #423 (Div. 2) A. Restaurant Tables(水题)
- 1.Android 子线程和UI的问题
- 解决windows10系统安装ie显示ie已安装却找不到ie的问题
- 第6章 关于Greenplum的数据库统计
- caller与callee
- JAVA面试相关问题整理