• 八数码问题(八数码难题)+数据


    题目在这里

    #include <cstdio>
    #include <cstring> 
    struct Map{int data[4][4],x,y,tot = 0;};
    Map queue[400000];
    int t = 1,w = 2,right[4][4],ans = -1;
    int px[5] = {0,-1,0,1,0},py[5] = {0,0,1,0,-1};
    void swap(int &A,int &B){int temp = A;A = B;B = temp;}
    bool inqueue[9][9][9][9][9][9][9][9];
    bool judge(Map x){
        for(int i = 1;i <= 3;i++)
            for(int j = 1;j <= 3;j++)
                if(x.data[i][j] != right[i][j])
                    return 0;
        return 1;
    }
    bool Iq(Map x,bool pp){inqueue[x.data[1][1]][x.data[1][2]][x.data[1][3]][x.data[2][1]][x.data[2][2]][x.data[2][3]][x.data[3][1]][x.data[3][2]] = pp;}
    bool iq(Map x){return inqueue[x.data[1][1]][x.data[1][2]][x.data[1][3]][x.data[2][1]][x.data[2][2]][x.data[2][3]][x.data[3][1]][x.data[3][2]];}
    void bfs(){
        while(t < w){
            Map x;
            for(int i = 1;i <= 4;i++){
                x = queue[t];
                int xx = x.x + px[i],yy = x.y + py[i];
                if(xx < 1 || xx > 3 || yy < 1 || yy > 3)continue;
                swap(x.data[x.x][x.y],x.data[xx][yy]);
                if(iq(x)){continue;}
                x.x = xx;x.y = yy;x.tot++;Iq(x,1);
                if(judge(x)){ans = x.tot;return;}
                queue[w++] = x;
            }
            t++;
        }
    }
    int main()
    {
        memset(inqueue,0,sizeof(inqueue));
        for(int i = 1;i <= 3;i++)
            for(int j = 1;j <= 3;j++){
                scanf("%d",&queue[1].data[i][j]);
                if(queue[1].data[i][j] == 0){queue[1].x = i;queue[1].y = j;}
            }
        for(int i = 1;i <= 3;i++)
            for(int j = 1;j <= 3;j++)
                scanf("%d",&right[i][j]);
        if(judge(queue[1])){printf("0");return 0;}
        Iq(queue[1],1);
        bfs();
        ans != -1 && ans <= 20 ? printf("%d",ans) : printf("No solution!");
        return 0;
    }

    思路:暴力广度优先搜索+暴力判重(使用启发式搜索+康托展开更好)

  • 相关阅读:
    const与readonly
    JQuery Tooltipster
    Log4Net使用
    asp.net mvc 4 beta 版已发布
    控件属性
    C# 获取当前路径
    对toLocaleString()、toString()、valueOf()的理解
    靶场练习3CSRF攻击
    计算字符串长度
    Android ListView 自定义适配器
  • 原文地址:https://www.cnblogs.com/frankying/p/6685032.html
Copyright © 2020-2023  润新知