IDA*一直不会啊。。。。
估价函数一直不会找啊。。。。。
这题就的估价函数求得就是目前有多少块。。。。
就是有多少连续的块
因为每次操作这个值最多改变3,所以
3 * ( pos - 1 ) + h() 应改小于等于 deep * 3才有可能
AC代码如下:
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
int N, deep;
int nows[16], endd[16];
bool isok(){
for( int i = 0; i < N; i++ ){
if( nows[i] != endd[i] ){
return false;
}
}
return true;
}
int h(){
int t = 0;
for( int i = 0; i < N; i++ ){
if( nows[i] + 1 != nows[i+1] ){
t++;
}
}
return t;
}
bool DFS( int pos ){
if( isok() ){
return true;
}
if( pos > deep || 3 * ( pos - 1 ) + h() > deep * 3 ){
return false;
}
int temp[16];
for( int i = 0; i < N; i++ ){
for( int j = i; j < N; j++ ){
for( int k = j + 1; k < N; k++ ){
int t = 0;
memcpy( temp, nows, 16 * sizeof( int ) );
for( int l = 0; l < i; l++ ){
nows[t++] = temp[l];
}
for( int l = j + 1; l <= k; l++ ){
nows[t++] = temp[l];
}
for( int l = i; l <= j; l++ ){
nows[t++] = temp[l];
}
for( int l = k + 1; l < N; l++ ){
nows[t++] = temp[l];
}
if( DFS( pos + 1 ) ){
return true;
}
memcpy( nows, temp, 16 * sizeof( int ) );
}
}
}
return false;
}
int main(){
int T;
scanf( "%d", &T );
while( T-- ){
scanf( "%d", &N );
for( int i = 0; i < N; i++ ){
endd[i] = i + 1;
}
for( int i = 0; i < N; i++ ){
scanf( "%d", &nows[i] );
}
nows[N] = N + 1;
if( isok() ){
printf( "0\n" );
continue;
}
deep = 0;
while( 1 ){
deep++;
if( DFS( 1 ) ){
printf( "%d\n", deep );
break;
}
if( deep >= 4 ){
printf( "5 or more\n" );
break;
}
}
}
return 0;
}