判断N数码问题是否有解

 http://acm.hdu.edu.cn/showproblem.php?pid=3600

题意:给定一个N数码的初始状态,问你是否可以到达终点状态

分析:先从8数码分析,把八数码的初始状态从上到下从左到右排成一排如 :

    2 1 3

    4 5 6  ----->2 1 3 4 5 6 7 8 #

    7 8 #

考虑空格与相邻位置的交换:两种情况,1)左右交换,2)上下交换。对于1)可知不会改变排列的逆序数,对于2)相当于在排列中向前或向后跳了两个数字

那么要么两个数字都比交换的那个数字大或小,这种情况逆序数加2或减2。.要么一个比它大,一个比它小,这种情况逆序数不变,所以综合这两种情况都不会

改变这个序列的逆序数。直观的看两个状态可互达当且仅当他们排列的逆序数同奇偶。

推广到N*N维的情况:

当N为奇数时:对于一个状态形成的序列,同样左右交换不会改变逆序数,上下交换逆序数加n-1或减n-1或不变因为n为基数所以逆序数的奇偶性不变

当N为偶数时:左右交换不改变逆序数,上下交换因为N为偶数,所以n-1为奇数所以上下交换一次奇偶性改变一次

结论:直观的看当N为奇数时奇偶同性可互达,N为偶数时,逆序数之和sum加上空格所在行距目标空格行的距离dis之和要和终点状态逆序数同奇偶

继续推广到N*N*N的情况:

左右交换,上下交换就不讨论了,这里只看层与层之间的交换,层与层的交换中间间隔了n^2-1个数,当n为奇数数时n^2-1为偶数,奇偶性不变,当n为偶数时为

交换一次,奇偶性改变一次,所以这种情况也需要考虑空格所在层与目标空格所在层之间的距离。

其中涉及到的证明不会,这只是个直观的结论,不过是正确的。证明参考:http://www.17shicheng.com/article/article.jsp?resourceID=29814

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值