对于给定八数码棋局的初始状态,我们的目标是通过交换空格与其相邻棋子使棋盘达到目标状态。

其中,游戏规则是只能交换空格与其上下左右四个方向的相邻棋子。

假设棋局目标状态为如下形式:(A、B、C、D、E、F、G、H表示棋子)

A  B  C

D  E  F

G  H

而初始状态就是A、B、C、D、E、F、G、H这八个棋子在这九个棋格上的任意分布。

并且我们对棋盘中每个棋格进行如下形式的编号:

1  2  3

4  5  6

7  8  9

那么,对于一个任意的棋局状态,我们可以取得这八个棋子(A、B、C、D、E、F、G、H)的一个数列:棋子按照棋格的编号依次进行排列,记为p=c[1]c[2]c[3]c[4]c[5]c[6]c[7]c[8](即A、B、C、D、E、F、G、H的一个排列)。

在分析之前,先引进逆序和逆序数的概念:对于棋子数列中任何一个棋子c[i](1≤i≤8),如果有j>i且c[j]

现在,我们对一个任意的棋局状态p=c[1]c[2]c[3]c[4]c[5]c[6]c[7]c[8]进行分析:

引理1:如果交换任何两个相邻的棋子,那么棋子数列的逆序数将发生奇偶性互变(奇偶性互变是指由奇数变为偶数,或由偶数变为奇数,下同)。

其证明很简单,假设交换的是c[i]和c[i+1],那么对于c[j](1≤j≤i-1或i+2≤j≤8)的逆序数并不改变。若交换之前 c[i]c[i+1],那么交换之后,c[i]的逆序数减1,而c[i+1]的逆序数不变。所以,引理1成立。

引理2:如果棋子数列经过n次相邻棋子交换后,若n为偶数,则数列逆序数奇偶性不变;若n为奇数,则数列逆序数将发生奇偶性互变。

其证明可以由引理1简单推出。

引理3:在满足上述约定的八数码问题中,空格与相邻棋子的交换不会改变棋局中棋子数列的逆序数的奇偶性。

证明:显然空格与左右棋子交换不会改变棋子数列的逆序数(因为数列并没有改变)。现在考虑空格与上下棋子交换的情况:若空格与上方的棋子交换(假设交换是可行的),将得到一个新数列。若假设交换棋子为c[i]=X,那么原数列p=c[1]...X c[i+1]c[i+2]...c[8]将变为新数列q=c[1]...c[i+1]c[i+2]X ...c[8](注意:在棋盘中,上下相邻的两棋格之间隔有两个棋格)。由原数列p到新数列q的转变可以通过如下方式加以解释:用X与c[i+1]、 c[i+2]先后进行两次相邻交换而完成状态转变。所以根据引理2知,由p状态到q状态并不会改变改变棋子数列的逆序数的奇偶性。同理可证空格与下方棋子交换也不会改变棋子数列的逆序数的奇偶性。所以,空格与相邻棋子的交换不会改变棋局中棋子数列的逆序数的奇偶性。

定理1

(1)当初始状态棋局的棋子数列的逆序数是奇数时,八数码问题无解;

(2)当初始状态棋局的棋子数列的逆序数是偶数时,八数码问题有解。

证明:由引理3知,按照八数码问题的游戏规则,在游戏过程中,棋局的棋子数列的逆序数的奇偶性不会发生变化。而上面规定的目标状态没有逆序存在,所以目标状态下棋局的逆序数为偶数(实际为0)。显然,可能的初始状态棋局的棋子数列的逆序数可能为奇数,也可能为偶数(因为把一个初始状态中任意相邻两个棋子交换,得到的新的状态作为初始状态,它们的奇偶性相反)。所以,对于任意一个初始状态,若其棋局的棋子数列的逆序数为奇数,则永远也不可能达到目标状态,即八数码问题无解;若其棋局的棋子数列的逆序数为偶数,(接下来如何证明)。

八数码问题c语言,八数码问题的可解性相关推荐

  1. 键盘扫描并控制数码管C语言,CH454 数码管显示驱动和键盘扫描控制芯片

    1.概述 CH454 是数码管显示驱动和键盘扫描控制芯片.CH454内置时钟振荡电路,可以动态驱动8 只16段的数码管或者128 只LED,支持11 段.14 段.16 段×8 以及17 段×7 等; ...

  2. A*算法解决八数码问题 Java语言实现

    A*算法解决八数码问题 Java语言实现 参考文章: (1)A*算法解决八数码问题 Java语言实现 (2)https://www.cnblogs.com/beilin/p/5981483.html ...

  3. c语言八数码A星算法代码解析,八数码问题c语言a星算法详细实验报告含代码解析...

    八数码问题c语言a星算法详细实验报告含代码解析 (13页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.9 积分 一.实验内容和要求 八数码问题:在3 ...

  4. 八、【中级篇】数码管驱动(74HC138,74HC595)

    数码管驱动 1.各类数码管介绍 2.4位数码管 数码管结构: 四位共阴极数码管 3.74HC138 4.74HC595 数码管接线图以及介绍: 1.各类数码管介绍 数码管也可以称为7段数码管或者8段数 ...

  5. 38译码器数码管c语言代码,38译码器驱动数码管电路图

    使用38译码器来驱动数码管来节省IO端口 (1)什么是38译码器? 38译码器有3个输入端口A.B.C和8个输出端口Y0-Y7.由输入端口控制输出端口的值 (2)为什么要使用38译码器 回想之前的驱动 ...

  6. c语言数码管数字时钟程序,数码管显示模拟8位时钟C语言程序设计

    原标题:数码管显示模拟8位时钟C语言程序设计 //数码时钟设计 #include // 包含寄存器定义的头文件 unsigned char Tab[ ]={0xc0,0xf9,0xa4,0xb0,0x ...

  7. java八种语言_Java语言八种基本类型

    Java语言八种基本类型 (2009-12-21 13:37:45) 标签: 杂谈 Java语言是一种严格的"类型化"语言.这意味着每个变量都必须有一个声明好的类型.Java语言提 ...

  8. 单片机c语言数码显示实验报告,单片机c语言版数码动态显示实验报告.doc

    单片机c语言版数码动态显示实验报告 数码管动态显示实验一.实验要求在Proteus软件中画好51单片机最小核心电路,包括复位电路和晶振电路在电路中增加四个7段数码管(共阳/共阴自选),将P1口作数据输 ...

  9. 7段并行数码管显示实验C语言,七段数码管显示十进制数字 (15)

    实验报告 实验题目 设有10个开关,编号分别为0,1,--,9. 设计电路实现某开关闭合时对应显示相应的十进制数字.要求:(1)写出设计说明,(2)用 Proteus或Multisim仿真. 实验方案 ...

  10. C语言编程统计八皇后问题的解的个数,八皇后问题C语言解法

    偶遇八皇后问题,随即自己写了一个仅供参考 #include #include #define SIZE 8 void Circumsribe(int(*checkerboard)[SIZE], int ...

最新文章

  1. 选redis还是memcache?
  2. HTML5新增标签与属性
  3. python实现文件下载-Python+django实现文件下载
  4. java安全编码指南之:lock和同步的正确使用
  5. SecureCRT连接CentOS阿里云,小键盘在VIM情况下,无法输入数字反而出现英文
  6. JAVA版游戏下载_我的世界Java版20w51a
  7. HDU 3342 Legal or Not(拓扑排序)
  8. 数学之美:嵌入式编程凹凸性之妙用(附C代码)
  9. C语言字符5,c语言总览5:字符输入和输出
  10. asp.net中SqlDataReader使用时关闭数据库连接的问题(转)
  11. Web前端/辅助工具
  12. [状压dp][剪枝搜索] 洛谷 P2831 愤怒的小鸟
  13. 老码农的2019这一年——
  14. win10 vs2010安装教程(超详细,附下载链接)
  15. 区块链:数字广告假量的“终结者”
  16. Win10蓝牙耳机连接成功但耳机没声音解决方案
  17. ESPIDF开发ESP32学习笔记【SPI与片外FLASH基础】
  18. c语言大作业打印课程表,课程表(c语言)
  19. 红蓝cp未能连接到服务器,红蓝CP产品分析
  20. CSA云安全指南V4.0 D1 D2

热门文章

  1. 电路串联和并联图解_初三物理串联和并联电路知识大全
  2. Android原生系统真的那么好用吗?安卓原生系统吊打其他系统,因为有Google-Play
  3. Android 修改屏幕尺寸
  4. 什么时候使用PD和PI——基于平衡小车分析
  5. 程序员大神常用软件:mybase,一款个人知识笔记管理神器
  6. gflags使用详解
  7. JS 时间格式化 时间戳 日期
  8. 商务统计_6 用图表演示数据 - 定性数据
  9. spring AOP切面及日志记录实现
  10. MiniUSB管脚接口引脚定义