Editing a Book UVA - 11212 IDA*

紫书的思路   主要一个是剪枝  一个是复制黏贴操作  经典的IDA*题 内附注释

 

#include
using namespace std;
int n;
int maxd;
int a[15];

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 is_sorted() {
  for(int i = 0; i < n-1; i++)
    if(a[i] >= a[i+1]) return false;
  return true;
}



bool dfs(int d,int maxd){
if(d*3 + h() > maxd*3) return false;  //剪枝,由书上可以知道一次更改最多只能实现3个排序正确如果(maxd-h)*3>h()肯定就不行了剪掉
  if(is_sorted()) return true;

  int b[15],olda[15];
  memcpy(olda,a,sizeof(a));  //把原始数据保护好
  for(int i=0;ij)b[cnt++]=a[k];    //把要复制的内容放在b里面
        for(int k=0;k<=cnt;k++){
            int cnt2=0;
            for(int p=0;p

 

你可能感兴趣的:(ACM,IDA*)