B29 IDA*算法 Booksort
视频链接:130 IDA算法 Booksort_哔哩哔哩_bilibili
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int N=16; int n,dep; int a[N],b[5][N]; //b是a的每层备份 int f(){ //估价函数: 修正错误连接的次数⌈tot/3⌉ int tot=0; for(int i=0; i<n-1; i++) if(a[i+1]!=a[i]+1) tot++; //错误连接数 return (tot+2)/3; //每次最多修正3个错误连接 } bool check(){ //检查正确顺序 for(int i=0; i<n; i++) if(a[i]!=i+1) return false; return true; } bool dfs(int u){ if(u+f()>dep) return false; //越界 if(check()) return true; //成功 for(int i=0; i<n; i++) for(int j=i+1; j<n; j++) for(int k=j,x,y; k<n; k++){ memcpy(b[u],a,sizeof a); //备份 for(x=j,y=i; x<=k; x++,y++) a[y]=b[u][x]; //[j,k]前插至i for(x=i; x<=j-1; x++,y++) a[y]=b[u][x]; //[i,j-1]后移 if(dfs(u+1)) return true; memcpy(a,b[u],sizeof a); //恢复现场 } return false; } int main(){ int T; cin>>T; while(T--){ cin>>n; for(int i=0; i<n; i++) cin>>a[i]; for(dep=0; dep<5&&!dfs(0); dep++); if(dep>=5) puts("5 or more"); else printf("%d\n",dep); } }