题目

题目

 


 

分析

get一下IDA*的技巧,感觉总体来说不难,主要是剪枝比较难想。

这是lrj的代码,比较通俗易懂,关键就是选定一个区间再取出来,插入到一个位置,接下来转移到这个状态。

 


 

代码

#include <bits/stdc++.h>
using namespace std; const int maxn=10;
int n,a[maxn]; bool is_sorted()
{
for(int i=0;i<n-1;i++)
if(a[i]>=a[i+1]) return false;
return true;
} int h()
{
int cnt=0;
for(int i=0;i<n-1;i++)
if(a[i]+1!=a[i+1]) cnt++;
if(a[n-1]!=n) cnt++;
return cnt;
} bool dfs(int d,int maxd)
{
if(d*3+h() > maxd*3) return false;
if(is_sorted()) return true; int b[maxn],olda[maxn];
memcpy(olda,a,sizeof(a));
for(int i=0;i<n;i++)
for(int j=i;j<n;j++)
{
//cut
int cnt=0;
for(int k=0;k<n;k++)
if(k<i || k>j) b[cnt++]=a[k]; //insert
for(int k=0;k<=cnt;k++)
{
int cnt2=0;
for(int p=0;p<k;p++) a[cnt2++]=b[p];
for(int p=i;p<=j;p++) a[cnt2++]=olda[p];
for(int p=k;p<cnt;p++) a[cnt2++]=b[p]; if(dfs(d+1,maxd)) return true;
memcpy(a,olda,sizeof(a));
}
}
return false;
} int solve()
{
if(is_sorted()) return 0;
int max_ans=5;
for(int maxd=1;maxd<max_ans;maxd++)
if(dfs(0,maxd)) return maxd;
return max_ans;
}
int main()
{
int kase=0;
while(scanf("%d",&n)==1 && n)
{
for(int i=0;i<n;i++) scanf("%d",&a[i]); printf("Case %d: %d\n",++kase,solve());
}
return 0;
}

最新文章

  1. 【总结】C# 设置委托的机理和简要步骤
  2. 再探banana
  3. SQL多行转多列
  4. Filter之——GZIP全站压缩
  5. sqlserver中常用的全局变量
  6. qq红心头像[中国心]制作教程之Photoshop教程
  7. SqlServer with递归查询的使用
  8. Flexible 弹性盒子模型之CSS flex-direction
  9. 封装对Cookie和Session设置或取值的类
  10. MongoDB基础教程系列--第七篇 MongoDB 聚合管道
  11. 爬虫之scrapy--基本操作
  12. python反射和面向对象的知识并简述基本的异常
  13. iOS 多语言的实现(本地化和国际化)
  14. Redis 参数说明
  15. EasyUI 分页 简洁代码
  16. pycharm的放大和缩小字体的显示 和ubunt的截圖工具使用 ubuntu上安装qq微信等工具
  17. Selenium清空列数据
  18. pandas的read_csv函数
  19. Triangular numbers
  20. FZU_1894 志愿者选拔 【单调队列】

热门文章

  1. c# html内容处理类
  2. 《gradle 用户指南中文版》第3章 安装 gradle
  3. 为什么写《Tomcat内核设计剖析》
  4. SpreadJS 在 Angular2 中支持哪些事件?
  5. Split功能的思想实现
  6. 为什么Android无法设置无标题栏?
  7. NSStringFromSelector(_cmd)和self
  8. linux下升级svn版本到1.8
  9. caffe 细节
  10. rabbitMQ高可用