• 大小: 5KB
    文件类型: .rar
    金币: 2
    下载: 1 次
    发布日期: 2021-06-10
  • 语言: 其他
  • 标签: Qt5拼图  

资源简介

Qt5实现的拼图,添加了一个自动寻路的功能

资源截图

代码片段和文件信息

#include “calres.h“
#include 

const int MAXN = 362890;
int fac[9] = {112624120720504040320};
int res[9] = {123456780};
int vis[MAXN];
                //   右    下    左     上
int nextDir[4][2] = {{01}{10}{0-1}{-10}};
char chDir[5] = “lurd“;
char path[200];
int length;
GYH::node que[400000];

int GYH::getLength()
{
    return length;
}

char* GYH::getResult()
{
    return path;
}

void GYH::swap(int *a int *b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}

int GYH::Cantor(int *s)
{
    int ijnumtemp;
    num = 0;
    for(i = 0; i < 9; ++i)
    {
        temp = 0;
        for(j = i+1; j < 9; ++j)
            if(s[j] < s[i]) ++temp;
        num += fac[8-i]*temp;
    }
    return num;
}

void GYH::CantorReverse(int *s int val)
{
    int flag[10];
    memset(flag0sizeof(flag));
    for(int i = 0; i < 9; ++i)
    {
        int rk = val/fac[8-i];
        for(int j = 0; j <= rk; ++j)
            if(flag[j]) ++rk;
        s[i] = rk;
        flag[rk] = 1;
        val = val%fac[8-i];
    }
}

void GYH::createPath(int index)
{
    if(que[index].parent == -1)
        return;
    createPath(que[index].parent);
    path[length++] = que[index].dir;
}

void GYH::BFS(int *s)
{
    int ans = Cantor(res);
    int num[9]position;
    for(int i = 0; i < 9; ++i)
    {
        num[i] = s[i];
        if(s[i] == 0)
            position = i;
    }
    memset(vis0sizeof(vis));
    int head = 0tail = 0;
    que[tail].parent = -1;
    que[tail].pos = position;
    que[tail].status = Cantor(num);
    vis[que[tail].status] = 1;
    ++tail;

    while(head < tail)
    {
        node cur = que[head];
        int x = cur.pos/3;
        int y = cur.pos%3;
        int txty;
        for(int k = 0; k < 4; ++k)
        {
            tx = x + nextDir[k][0];
            ty = y + nextDir[k][1];
            if(tx < 0 || ty < 0 || tx > 2 || ty > 2) continue;
            CantorReverse(numcur.status);
            int newPos = tx*3+ty;
            swap(&num[newPos]&num[cur.pos]);
            int newStatus = Cantor(num);
            if(vis[newStatus] == 0)
            {
                vis[newStatus] = 1;
                node sub;
                sub.parent = head;
                sub.status = newStatus;
                sub.pos = newPos;
                //这是之前的状态移动到当前状态的移动方向
                sub.dir = chDir[k];
                que[tail++] = sub;

                if(newStatus == ans)
                {
                    length = 0;
                    createPath(tail-1);
                    return;
                }
            }
        }
        ++head;
    }
}

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件        116  2012-09-13 12:24  jigsaw\background.png

     文件       2779  2017-02-27 23:44  jigsaw\calres.cpp

     文件        314  2017-02-27 23:42  jigsaw\calres.h

     文件        112  2017-02-24 16:09  jigsaw\img.qrc

     文件        407  2017-02-27 23:38  jigsaw\jigsaw.pro

     文件        175  2017-02-24 15:59  jigsaw\main.cpp

     文件       6764  2017-02-28 00:02  jigsaw\widget.cpp

     文件       1201  2017-02-28 00:00  jigsaw\widget.h

     目录          0  2017-03-31 22:01  jigsaw

----------- ---------  ---------- -----  ----

                11868                    9


评论

共有 条评论

相关资源