`
donnki
  • 浏览: 45854 次
  • 性别: Icon_minigender_1
  • 来自: 火星
文章分类
社区版块
存档分类
最新评论

拼图初始化算法实现

 
阅读更多
定理:图形A与图形B等价的充要条件图形A的排列的逆序数加上0元素行号和列号的奇偶性等于图形B的排列的逆序数加上0元素行号和列号的奇偶性。为方便表述,把图形排列的逆序数加上0元素行号和列号的奇偶性称为图形的奇偶性。(参考http://www.cppblog.com/lemene/archive/2007/10/04/33405.html)

排列 1 3 2 6 0 5 4 7 8,它的逆序数为8,0元素行号为2,列号为2。逆序数加行号,列号的奇偶性为偶。
排列 1 2 3 4 5 6 7 8 0,它的逆序数为8,0元素行号为3,列号为3。逆序数加行号,列号的奇偶性为偶。两个图形的奇偶性相同,根据定理判断它们等价。

static void shuffle(int size, int *a){ //打乱数组顺序
	for (int i=0; i<size; i++) {
		int r = arc4random()%size;
		int t = a[i];
		a[i] = a[r];
		a[r] = t;
	}
}

static bool parityCheck(int length, int *a){
    //返回数组的排列的逆序数加上0元素行号和列号的奇偶性,true为偶,false为奇。
    int v = 0;
    int zeroIndex = -1;
    for(int i=0; i<length; i++){
        for(int j=i+1; j<length; j++){
            if(a[i]>a[j]){
                v++;
            }
        }
        if(a[i] == 0) zeroIndex = i;
    }
    int lineIndex = zeroIndex/COLS+1;
    int colIndex = zeroIndex%COLS+1;		
    
    return (lineIndex + colIndex + v) % 2 == 0;
    
}


    for (int i=0; i<NODE_COUNT; i++) {
        nodes[i] = i;
    }
    
    shuffle(NODE_COUNT, nodes);
    if (parityCheck(NODE_COUNT, nodes) != parityCheck(NODE_COUNT, target)) {
        //若不满足定理,则交换数组最后两个值,使其奇偶性改变。
        int i = nodes[NODE_COUNT-2];
        nodes[NODE_COUNT-2] = nodes[NODE_COUNT-1];
        nodes[NODE_COUNT-1] = i;
    }
分享到:
评论

相关推荐

    基于遗传算法的拼图自动完成游戏代码

    1. **初始化种群**:首先,随机生成一个包含多个可能解的初始种群,每个解代表一种拼图的排列方式。 2. **适应度函数**:定义一个适应度函数来评估每个个体(拼图排列)的好坏。在这个游戏中,适应度可能是衡量拼图...

    自动解决智能拼图,A*算法+生成可解拼图(C++)

    在本项目中,我们主要探讨的是如何利用计算机算法来解决智能拼图问题,特别是通过A*算法实现自动化求解。智能拼图,也被称为滑动拼图或十五拼图,是一种经典的逻辑游戏,玩家需要通过移动空格将打乱的数字方块重新...

    使用A*算法实现的9宫格拼图小游戏,包含源码和程序

    《使用A*算法实现的9宫格拼图小游戏解析》 在编程领域,尤其是在游戏开发中,路径规划是一项至关重要的技术。A*(A-star)算法作为一种高效的寻路算法,被广泛应用于各种需要智能决策的场景,如机器人路径规划、...

    拼图 ---- C 实现的拼图程序

    拼图的核心算法主要分为两个部分:拼图的初始化和拼图的移动。初始化阶段,程序通常会随机打乱一个完整的图像,形成拼图的初始状态。这涉及到图像处理和随机数生成的知识,通过读取图像文件,将其分割成多个小块,...

    拼图游戏自动复原支持3乘3以上易语言源码

    在这个源码中,自动复原功能通过A星算法实现了对任意阶数3*3以上的拼图的高效解决,使得玩家可以观察到算法的执行过程,理解其背后的逻辑。 五、编程实践 这个源码对于学习易语言和算法的开发者来说,是一个很好的...

    拼图游戏的算法.txt

    根据提供的文件信息,我们可以分析出该文档主要讨论的是关于拼图游戏的一种算法实现。下面将对这个算法进行详细的解析。 ### 一、拼图游戏概述 拼图游戏是一种经典的智力游戏,玩家需要通过移动空白方格周围的数字...

    拼图游戏算法

    1. **初始化**:从起始状态开始,标记当前状态为已访问。 2. **递归探索**:检查当前状态是否为目标状态。如果是,返回“找到解决方案”;如果不是,则选择一个未被访问的相邻状态,并进入该状态。 3. **回溯**:...

    A*算法实现八数码问题

    1. 初始化:创建一个空的开放列表和一个关闭列表,设置起始状态为当前拼图布局,将起始状态加入开放列表,并计算其曼哈顿距离作为初始代价。 2. 搜索:从开放列表中选择具有最低F值(F(n) = G(n) + h(n),G(n)是从...

    拼图游戏,QT实现,学C++的可以参考下原理

    例如,当用户点击“开始游戏”按钮时,会触发相应的事件处理函数,执行图片分割和拼图初始化操作。 6. **算法实现**:拼图游戏的核心是分割和重组算法。分割算法可能包括选择分割线的位置、保证每个部分的形状和...

    八数码A算法实现八数码A算法实现

    八数码游戏,也被称为滑动拼图或15拼图,是一种经典的逻辑...总之,八数码问题的A*算法实现涉及启发式搜索、节点评估和状态转移等概念。通过理解和实现这个算法,我们可以更好地掌握路径寻找和最优化问题的解决策略。

    a*算法实现八数码问题

    1. 初始化:设置初始状态,开放列表(待处理节点)包含初始状态,关闭列表(已处理节点)为空。 2. 搜索:从开放列表中选取具有最小f值的节点进行扩展。 3. 扩展:将当前节点的相邻节点加入开放列表,并更新它们的g...

    vc实现九宫格的A*算法

    1. 初始化九宫格:创建一个二维数组,表示每个格子的状态(是否可通行、是否为目标等)。 2. 计算启发式函数:根据选择的启发式方式(如曼哈顿距离或欧几里得距离),计算每个节点的h-cost。 3. 实现A*搜索:使用...

    包含自动求解算法程序的完美版JavaScript拼图游戏

    JavaScript拼图游戏是一种深受用户喜爱的在线娱乐方式,它基于经典的拼图玩法,结合现代编程技术,为用户提供了一种互动的、智能化的游戏体验。在这个完美版的JavaScript拼图游戏中,重点在于其内置的自动求解算法,...

    拼图游戏(java实现)

    此外,为了保存游戏进度,可能还需要实现序列化或JSON解析。 8. **设计模式**:在编写代码时,开发者可能应用了一些设计模式,如单例模式(用于管理游戏实例)、工厂模式(用于创建拼图块对象)或者观察者模式...

    MFC拼图游戏程序完整版

    **MFC拼图游戏程序详解...总之,MFC拼图游戏是一个结合了MFC编程基础、图形界面设计、用户交互逻辑以及游戏算法实现的综合性项目。通过分析和学习这个程序,开发者不仅可以深入了解MFC的使用,还能提升游戏开发的能力。

    PUZZLE15_dfs_C++求解15拼图问题_bfs_

    首先,将初始状态加入队列,并初始化步数为0。然后,不断地从队列中取出状态,检查是否达到目标,如果不是,则将所有可能的下一步状态入队,并增加步数。 **迭代加深的深度优先搜索(IDDFS):** IDDFS结合了DFS和...

    8数码游戏 A*算法 C++实现

    `main.cpp`是程序的入口,负责初始化和调用A*算法来解决8数码问题。 `Compare.h`可能包含了一个比较函数,用于在优先队列中根据f(n)值对节点进行排序,这是A*算法中关键的一环,确保总是选择最优路径。`...

    拼图游戏的设计与实现.rar

    JavaScript将处理游戏的初始化、方块的打乱、用户的交互以及游戏的胜利条件判断等功能。例如,游戏启动时,JavaScript会根据3*3的规则将图片切割成9个部分,并随机打乱这些方块的位置。用户每移动一次方块,...

    A*算法实现N数码问题求解

    2. **初始化**:创建起始节点并设置其g值为0,h值由启发式函数计算,将起始节点加入优先队列。 3. **搜索过程**:从优先队列中取出f值最低的节点,生成所有可能的后继节点。对于每个后继节点,计算其g值(父节点g值...

Global site tag (gtag.js) - Google Analytics