您的位置:首页 > 编程语言 > C语言/C++

【wikioi】1225八数码问题

2014-05-14 21:49 429 查看
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;
const int N=20000000;
queue < string > Q1;
queue < int > Q2;
int jc[9]={1,1,2,6,24,120,720,5040,40320};
bool p
;
int cmp;
int hashnum(string st)
{
int a[9],ans=1,i,j;
for (i=1;i<=9;i++) a[i]=st[i-1]-48;
for (i=1;i<=9;i++)
{
int sum=0;
for (j=i+1;j<=9;j++)
if (a[j]<a[i]) sum++;
ans+=sum*jc[9-i];
}
return ans;
}
string work1(string s)
{
int a[10],j;
for (int i=1;i<=9;i++){//字符串转化为数字
a[i]=s[i-1]-48;
if (a[i]==0) j=i;
}
if (j<4) return s;
a[0]=a[j];
a[j]=a[j-3];
a[j-3]=a[0];
s="";
for (int i=1;i<=9;i++)
s+=(a[i]+48);
return s;
}
string work2(string s)
{
int a[10],j;
for (int i=1;i<=9;i++){
a[i]=s[i-1]-48;
if (a[i]==0) j=i;
}
if (j%3==0) return s;
a[0]=a[j];
a[j]=a[j+1];
a[j+1]=a[0];
s="";
for (int i=1;i<=9;i++)
s+=(a[i]+48);
return s;
}
string work3(string s)
{
int a[10],j;
for (int i=1;i<=9;i++){
a[i]=s[i-1]-48;
if (a[i]==0) j=i;
}
if (j%3==1) return s;
a[0]=a[j];
a[j]=a[j-1];
a[j-1]=a[0];
s="";
for (int i=1;i<=9;i++)
s+=(a[i]+48);
return s;
}
string work4(string s)
{
int a[10],j;
for (int i=1;i<=9;i++){
a[i]=s[i-1]-48;
if (a[i]==0) j=i;
}
if (j>6) return s;
a[0]=a[j];
a[j]=a[j+3];
a[j+3]=a[0];
s="";
for (int i=1;i<=9;i++)
s+=(a[i]+48);
return s;
}
int bfs(int k,string s)
{
Q1.push(s);Q2.push(k);
while (!Q1.empty())
{
s=Q1.front();k=Q2.front();
Q1.pop();Q2.pop();
int num=hashnum(s);
if (num==cmp) return k;
if (p[num]) continue;else p[num]=1;
Q1.push(work1(s));Q2.push(k+1);
Q1.push(work2(s));Q2.push(k+1);
Q1.push(work3(s));Q2.push(k+1);
Q1.push(work4(s));Q2.push(k+1);
}
}
int main()
{
string s="123804765";要达到的目标状态
cmp=hashnum(s);
cin>>s; work1(s);
cout<<bfs(0,s)<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 启发式搜索