如何判斷一個拼圖是否可還原!


在寫完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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM