定理:图形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*算法实现自动化求解。智能拼图,也被称为滑动拼图或十五拼图,是一种经典的逻辑游戏,玩家需要通过移动空格将打乱的数字方块重新...
《使用A*算法实现的9宫格拼图小游戏解析》 在编程领域,尤其是在游戏开发中,路径规划是一项至关重要的技术。A*(A-star)算法作为一种高效的寻路算法,被广泛应用于各种需要智能决策的场景,如机器人路径规划、...
拼图的核心算法主要分为两个部分:拼图的初始化和拼图的移动。初始化阶段,程序通常会随机打乱一个完整的图像,形成拼图的初始状态。这涉及到图像处理和随机数生成的知识,通过读取图像文件,将其分割成多个小块,...
在这个源码中,自动复原功能通过A星算法实现了对任意阶数3*3以上的拼图的高效解决,使得玩家可以观察到算法的执行过程,理解其背后的逻辑。 五、编程实践 这个源码对于学习易语言和算法的开发者来说,是一个很好的...
根据提供的文件信息,我们可以分析出该文档主要讨论的是关于拼图游戏的一种算法实现。下面将对这个算法进行详细的解析。 ### 一、拼图游戏概述 拼图游戏是一种经典的智力游戏,玩家需要通过移动空白方格周围的数字...
1. **初始化**:从起始状态开始,标记当前状态为已访问。 2. **递归探索**:检查当前状态是否为目标状态。如果是,返回“找到解决方案”;如果不是,则选择一个未被访问的相邻状态,并进入该状态。 3. **回溯**:...
1. 初始化:创建一个空的开放列表和一个关闭列表,设置起始状态为当前拼图布局,将起始状态加入开放列表,并计算其曼哈顿距离作为初始代价。 2. 搜索:从开放列表中选择具有最低F值(F(n) = G(n) + h(n),G(n)是从...
例如,当用户点击“开始游戏”按钮时,会触发相应的事件处理函数,执行图片分割和拼图初始化操作。 6. **算法实现**:拼图游戏的核心是分割和重组算法。分割算法可能包括选择分割线的位置、保证每个部分的形状和...
八数码游戏,也被称为滑动拼图或15拼图,是一种经典的逻辑...总之,八数码问题的A*算法实现涉及启发式搜索、节点评估和状态转移等概念。通过理解和实现这个算法,我们可以更好地掌握路径寻找和最优化问题的解决策略。
1. 初始化:设置初始状态,开放列表(待处理节点)包含初始状态,关闭列表(已处理节点)为空。 2. 搜索:从开放列表中选取具有最小f值的节点进行扩展。 3. 扩展:将当前节点的相邻节点加入开放列表,并更新它们的g...
1. 初始化九宫格:创建一个二维数组,表示每个格子的状态(是否可通行、是否为目标等)。 2. 计算启发式函数:根据选择的启发式方式(如曼哈顿距离或欧几里得距离),计算每个节点的h-cost。 3. 实现A*搜索:使用...
JavaScript拼图游戏是一种深受用户喜爱的在线娱乐方式,它基于经典的拼图玩法,结合现代编程技术,为用户提供了一种互动的、智能化的游戏体验。在这个完美版的JavaScript拼图游戏中,重点在于其内置的自动求解算法,...
此外,为了保存游戏进度,可能还需要实现序列化或JSON解析。 8. **设计模式**:在编写代码时,开发者可能应用了一些设计模式,如单例模式(用于管理游戏实例)、工厂模式(用于创建拼图块对象)或者观察者模式...
**MFC拼图游戏程序详解...总之,MFC拼图游戏是一个结合了MFC编程基础、图形界面设计、用户交互逻辑以及游戏算法实现的综合性项目。通过分析和学习这个程序,开发者不仅可以深入了解MFC的使用,还能提升游戏开发的能力。
首先,将初始状态加入队列,并初始化步数为0。然后,不断地从队列中取出状态,检查是否达到目标,如果不是,则将所有可能的下一步状态入队,并增加步数。 **迭代加深的深度优先搜索(IDDFS):** IDDFS结合了DFS和...
`main.cpp`是程序的入口,负责初始化和调用A*算法来解决8数码问题。 `Compare.h`可能包含了一个比较函数,用于在优先队列中根据f(n)值对节点进行排序,这是A*算法中关键的一环,确保总是选择最优路径。`...
JavaScript将处理游戏的初始化、方块的打乱、用户的交互以及游戏的胜利条件判断等功能。例如,游戏启动时,JavaScript会根据3*3的规则将图片切割成9个部分,并随机打乱这些方块的位置。用户每移动一次方块,...
2. **初始化**:创建起始节点并设置其g值为0,h值由启发式函数计算,将起始节点加入优先队列。 3. **搜索过程**:从优先队列中取出f值最低的节点,生成所有可能的后继节点。对于每个后继节点,计算其g值(父节点g值...