刚完成人工智能的作业,就发上来
A*算法的关键在于启发函数和设计,这个启发函数也上在网上找到的F(X)=g(x)+h(x) 表示节点当前的层次 表示每个数码与目标之间的曼哈顿距离之和,每次从F(X)最小的节点开始扩展,放入表中后排序
#include<iostream>
#include<fstream>
#include<algorithm>
#include<ctime>
using namespace std;
int ten[]={1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};
struct zhan
{
int x;
int y;
}arry[9];
struct abc
{
int t;//press number
int dis;
int orgl;
int no;//leveal
}arr[20000];
int ptr=0;
bool cmp(abc a,abc b)
{
if(a.dis+a.no<b.dis+b.no)
return true;
return false;
}
bool abcd(abc a,abc b)
{
if(a.no<b.no)
return true;
return false;
}
bool app(int a)
{
for(int i=0;i<ptr;i++)
if(arr[i].t==a)
return true;
return false;
}
int des=123804765;
int desarr[9]={1,2,3,8,0,4,7,6,5};
int temparr[9];//={8,7,5,6,4,3,2,1,0};
int temp;
int sta;
int main()
{
clock_t t1,t2;
//ofstream cout("abcde.txt");
int ne=0;
for(int i=0;i<9;i++)
{
arry[desarr[i]].x=i/3;
arry[desarr[i]].y=i%3;
}
cout<<"please input original series,spaced by a blank"<<endl;
for(int i=0;i<9;i++)
{
cin>>temparr[i];
}
t1=clock();
for(int i=0;i<9;i++)
if(temparr[i]!=0)
for(int j=i+1;j<9;j++)
if(temparr[j]!=0)
if(temparr[j]<temparr[i])
ne++;
//int tttttttttttt;
if((ne&1)==0)
{
cout<<"NO SOLUTION"<<endl;
return 0;
}
//int
for(int j=0;j<9;j++)
{
temp+=temparr[j]*ten[8-j];
}
int t=0;
for(int i=0;i<9;i++)
{
t+=abs(i/3-arry[temparr[i]].x)+abs(i%3-arry[temparr[i]].y);
//t++;
}
arr[ptr].t=temp;
arr[ptr].no=0;
arr[ptr].orgl=0;
arr[ptr++].dis=t;
int tag=t;
cout<<endl;
while(1)
{
int tt,t=arr[0].t;
arr[0].dis=100000;
tt=t;
int NO;
//arr[0].dis=10;
NO=arr[0].no;
int pos;
for(int i=0;i<9;++i)
{
temparr[i]=t/ten[8-i];
if(temparr[i]==0)
pos=i;
t%=ten[8-i];
}
/*for(int i=0;i<9;i++)
{
if(i!=0&&i%3==0)
cout<<endl;
cout<<temparr[i]<<" ";
}*/
//cout<<endl<<endl;
if(tt==des)
{
cout<<ptr<<endl;
cout<<arr[0].no<<" "<<"steps to target"<<endl;
int trail=arr[0].no+1;
int po[50],tttt=arr[0].no;
sort(arr,arr+ptr,abcd);
while(arr[ptr-1].t!=des)
ptr--;
ptr--;
int ok=ptr;
po[tttt--]=ok;
while(arr[ok].orgl!=0)
{
if(arr[ok].t==arr[ptr].orgl)
{
po[tttt--]=ok;
ptr=ok;
}
ok--;
}
po[tttt--]=ok;
for(int i=0;i<trail;i++)
{
for(int j=0;j<9;j++)
{
if(j%3==0)
cout<<endl;
cout<<arr[po[i]].t/ten[8-j]<<" ";
arr[po[i]].t%=ten[8-j];
}
cout<<endl;
}
t2=clock();
cout<<"Time Cosume:"<<t2-t1<<"ms"<<endl;
break;
}
if(pos>2)
{
int tp=0;
temparr[pos-3]=temparr[pos-3]^temparr[pos];
temparr[pos]=temparr[pos-3]^temparr[pos];
temparr[pos-3]=temparr[pos-3]^temparr[pos];
temp=0;
//if(ptr>10&&arr[ptr-1].dis==1000)
//ptr--;
for(int i=0;i<9;i++)
{
//if(temparr[i]!=desarr[i])
tp+=abs(i/3-arry[temparr[i]].x)+abs(i%3-arry[temparr[i]].y);
temp+=temparr[i]*ten[8-i];
}
if(!app(temp))
{
arr[ptr].dis=tp;
arr[ptr].no=NO+1;
arr[ptr].orgl=arr[0].t;
arr[ptr++].t=temp;
sta=1;
}
temparr[pos-3]=temparr[pos-3]^temparr[pos];
temparr[pos]=temparr[pos-3]^temparr[pos];
temparr[pos-3]=temparr[pos-3]^temparr[pos];
}
if(pos<6)
{
int tp=0;
temparr[pos+3]=temparr[pos+3]^temparr[pos];
temparr[pos]=temparr[pos+3]^temparr[pos];
temparr[pos+3]=temparr[pos+3]^temparr[pos];
temp=0;
//if(ptr>10&&arr[ptr-1].dis==1000)
//ptr--;
for(int i=0;i<9;i++)
{
//if(temparr[i]!=desarr[i])
tp+=abs(i/3-arry[temparr[i]].x)+abs(i%3-arry[temparr[i]].y);
//tp++;
temp+=temparr[i]*ten[8-i];
}
if(!app(temp))
{
arr[ptr].dis=tp;
arr[ptr].no=NO+1;
arr[ptr].orgl=arr[0].t;
arr[ptr++].t=temp;
sta=1;
}
temparr[pos+3]=temparr[pos+3]^temparr[pos];
temparr[pos]=temparr[pos+3]^temparr[pos];
temparr[pos+3]=temparr[pos+3]^temparr[pos];
}
if(pos%3>0)
{
int tp=0;
temparr[pos-1]=temparr[pos-1]^temparr[pos];
temparr[pos]=temparr[pos-1]^temparr[pos];
temparr[pos-1]=temparr[pos-1]^temparr[pos];
temp=0;
//if(ptr>10&&arr[ptr-1].dis==1000)
//ptr--;
for(int i=0;i<9;i++)
{
//if(temparr[i]!=desarr[i])
tp+=abs(i/3-arry[temparr[i]].x)+abs(i%3-arry[temparr[i]].y);
//tp++;
temp+=temparr[i]*ten[8-i];
}
if(!app(temp))
{
arr[ptr].dis=tp;
arr[ptr].no=NO+1;
arr[ptr].orgl=arr[0].t;
arr[ptr++].t=temp;
sta=1;
}
temparr[pos-1]=temparr[pos-1]^temparr[pos];
temparr[pos]=temparr[pos-1]^temparr[pos];
temparr[pos-1]=temparr[pos-1]^temparr[pos];
}
if(pos%3<2)
{
int tp=0;
temparr[pos+1]=temparr[pos+1]^temparr[pos];
temparr[pos]=temparr[pos+1]^temparr[pos];
temparr[pos+1]=temparr[pos+1]^temparr[pos];
temp=0;
//if(ptr>10&&arr[ptr-1].dis==1000)
//ptr--;
for(int i=0;i<9;i++)
{
//if(temparr[i]!=desarr[i])
tp+=abs(i/3-arry[temparr[i]].x)+abs(i%3-arry[temparr[i]].y);
//tp++;
temp+=temparr[i]*ten[8-i];
}
if(!app(temp))
{
arr[ptr].dis=tp;
arr[ptr].no=NO+1;
arr[ptr].orgl=arr[0].t;
arr[ptr++].t=temp;
sta=1;
}
temparr[pos+1]=temparr[pos+1]^temparr[pos];
temparr[pos]=temparr[pos+1]^temparr[pos];
temparr[pos+1]=temparr[pos+1]^temparr[pos];
}
if(sta==1)
{
sort(arr,arr+ptr,cmp);
}
}
return 0;
}