如何判断一个拼图是否可还原!

在写完JS版本拼图游戏以后,偶然发现其实打乱顺序的拼图不是都能还原的。

在一个3*3的拼图中,会把图片裁切成9块,然后打乱顺序,通过调换空格块与邻块的位置来还原图片。

 

(图1)完全还原的拼图(设 8 号为空格位)

0 1 2
3 4 5
6 7 8

(图2)一个不能还原的顺序(拼到最后你发现6和7的位置倒了,而其他图片的位置正确)

0 1 2
3 4 5
7 6 8

 

如何判断一个打乱的拼图可还原?

一个打乱顺序的拼图,把数字连起来可以组成一个排列(比如图2= 0123456768)。

可以通过计算这个排列的逆序数个数加空格位置的坐标,最终得到的数的奇偶性判断。

数学原理比较复杂您可以看 http://blog.csdn.net/tailzhou/article/details/3002442

/**

    判断一个打乱顺序的数字拼图是否可还原
    
    order: 打乱以后的数字顺序;比如[0,1,2,3,4,5,7,6,8]
            order里的数字8表示空位
    size: 3*3的拼图就传3就可以了
    
    返回值:true false  
*/
function solvability(order, size){
    var a;
    var count = 0;
    var m = 0;
    var n = 0;
    
    var len = order.length;
    size = size || 3;
    //[0,1,2,3,4,5,7,6,8]
    for(var i=0; i<len; i++){
        a = order[i];
        

        //if( a == 8){
        if(a == size*size-1){
     
            m = parseInt(i/size);
            n = parseInt(i%size);
        }
            
        for(var j=i+1; j<len; j++){
            
            if(order[j]<a){
                count++;
            }
        }
    }
    count += m;
    count += n;
    return count%2 == 0;
}

 

posted @ 2012-04-25 11:34  Jun.lu  阅读(4695)  评论(1编辑  收藏