A*算法在八数码问题上的应用


刚完成人工智能的作业,就发上来

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;
}

        


你可能感兴趣的:(A*算法在八数码问题上的应用)