IDA*
就是直接枚举步数上限
然后A*剪枝一下
然后估价函数的话是(某两个连续的元素之间的差值==1)^1
呵呵..........
其实就是两个连续元素差值的绝对值大于1的个数
然而我也不会证明
类似于你每一次翻转的话
最多只能减去这样的个数一个
然后就能作为估价函数了
下面是代码
并没有过,还是RE状态
求dalao帮忙找错误
#include<iostream>
#include<fstream>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
int pan[53];
int n,ans,s;
int astar(){
int fanhui=0;
for(int i=1;i<=n-1;i++){
if(abs(pan[i+1]-pan[i])>1){
fanhui++;
}
}
return fanhui;
}
bool pd(){
for(int i=1;i<=n-1;i++){
if(pan[i+1]-pan[i]!=1){
return false;
}
}
return true;
}
void dfs(int k){
int v=astar();
if(k>s||k+v>s){
return;
}
if(pd()==true){
ans=k;
}
int tmp[52];
memcpy(tmp,pan,sizeof(pan));
for(int i=n;i>=2;i--){
int l=1,r=i;
while(l<=r){
swap(pan[l],pan[r]);
l++;r--;
}
dfs(k+1);
memcpy(pan,tmp,sizeof(tmp));
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
cin>>pan[i];
}
ans=0;
for(s=0;;s++){
dfs(0);
if(ans){
printf("%d",ans);
return 0;
}
}
return 0;
}
/*
in:
5
2 4 3 5 1
out:
5
*/