AOJ Heuristic Search - 8 Puzzle (九宫格+康托展开排重)

bfs进行解决。

刚开始想用map进行判重,结果重载运算符那块卡了半天,又学了康托展开进行判重,

bfs好长时间没写了,卡了半天,在for循环中下一步竟然受到上一部影响,太失误了。。。。。。

ac代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<cmath>
#include<cstdlib>
#include<list>
#include<queue>
#define mm(a,b) memset(a,b,sizeof(a))
#define ACCELERATE (ios::sync_with_stdio(false),cin.tie(0))
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
#define MAXN 0x3f3f3f3f3f3f3f3f
#define PI acos(-1.0)
#define E exp(1.0)
using namespace std;

//#define debug

struct Puzzle{
    int e[10];
    int space;
    int ans;
};

Puzzle tmp;

bool state[362880];

int kangtuo(int x[])  //康拓展开进行判重
{
    int fac[]={1,1,2,6,24,120,720,5040,40320};
    int i,j,t,sum;
    sum = 0;
    for(i=0;i<9;i++)
    {
        t = 0;
        for(j=i+1;j<9;j++)
        {
            if(x[j]<x[i])
                t++;
        }
        sum = sum+t*fac[8-i];
    }
    if(state[sum]==1)
        return 0;
    else
    {
        state[sum] = 1;
        return 1;
    }
}

bool judge(Puzzle t){
    for(int i=0;i<=8;i++){
        if(t.e[i]!=i+1) return false;
    }
    return true;
}

const int dx[4]={0,1,0,-1};
const int dy[4]={1,0,-1,0};

int bfs(){
    queue<Puzzle> q;
    q.push(tmp);
    while(!q.empty()){
        Puzzle t=q.front();
        q.pop();
        kangtuo(t.e);
        if(judge(t)) return t.ans;
        for(int i=0;i<4;i++){
            int sx=t.space/3+dx[i];
            int sy=t.space%3+dy[i];
            if(sx>=3||sy>=3||sx<0||sy<0){
                continue;
            }
            Puzzle f;
            f.ans=t.ans+1;
            f.space=sx*3+sy;
//            cout<<sx<<" "<<sy<<endl;
            memcpy(f.e,t.e,sizeof(t.e));
            swap(f.e[sx*3+sy],f.e[t.space]);
            if(!kangtuo(f.e)) continue;

            q.push(f);
        }
    }
}

int main()
{
    #ifdef debug
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    #endif // debug

    ACCELERATE;
    mm(state,0);
    for(int i=0;i<9;i++){
        cin>>tmp.e[i];
        if(tmp.e[i]==0){
            tmp.e[i]=9;
            tmp.space=i;
            tmp.ans=0;
        }
    }
    int ans=bfs();
    cout<<ans<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40679299/article/details/81078083