先mark一下。
先附个A*的代码
注意一下
判重的 问题
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#include <algorithm>
#include <queue>
#include <string.h>
#include <set>
using namespace std;
const int maxn = 32 ;
int n ;
struct node {
int depth ;
int h ;
char array[20] ;
int operator < (const node& obj) const
{
return depth+h > obj.depth+obj.h ;
}
}start;
inline bool get(int &t)
{
bool flag = 0 ;
char c;
while(!isdigit(c = getchar())&&c!='-') if( c == -1 ) break ;
if( c == -1 ) return 0 ;
if(c=='-') flag = 1 , t = 0 ;
else t = c ^ 48;
while(isdigit(c = getchar())) t = (t << 1) + (t << 3) + (c ^ 48) ;
if(flag) t = -t ;
return 1 ;
}
inline int abs(int x) { return x > 0 ? x : -x; }
int h_(node& a)
{
int i , ans = a.array[0] != 1 ;
for( i = 1 ; i < n ; i++) ans += abs(a.array[i]-a.array[i-1]) != 1 ;
a.h = ans ;
return ans ;
}
struct cmp {
bool operator()(const node &a,const node &b) const
{
int i ;
for( i = 0 ; i < n ; i++) if( a.array[i] != b.array[i] ) break;
return i < n ;
}
};
void solve()
{
priority_queue<node> q ;
set<node,cmp> st ;
h_(start);
start.depth = 0 ;
q.push(start);
while (!q.empty())
{
node sth = q.top() ; q.pop();
if( st.find(sth) != st.end() ) continue;
st.insert(sth);
if(sth.h==0)
{
printf("%d\n",sth.depth);
return;
}
int i , j ;
j = sth.depth+1;
for( i = 0 ; i < n - 1 ; i++)
{
/*reverse[i,n-1]*/
node ss = sth ;
reverse(ss.array+i,ss.array+n);
ss.depth = j ;
h_(ss);
q.push(ss);
}
}
}
int main()
{
int i , j ;
while (get(n)&&n)
{
for( i = 0 ; i < n ; i++) { get(j); start.array[i]=j; }
solve();
}
}