您的位置:首页 > 其它

几道启发式搜索问题 soj2831

2012-08-31 21:43 127 查看
先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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: