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