N N數碼問題

2022-05-15 09:54:59 字數 1521 閱讀 4228

時間限制: 1 sec  記憶體限制: 128 mb

你一定玩過八數碼遊戲,它實際上是在乙個3*3的網格中進行的,1個空格和1~8這8個數字恰好不重不漏地分布在這3*3的網格中。

例如:5 2 8

1 3 _

4 6 7

在遊戲過程中,可以把空格與其上、下、左、右四個方向之一的數字交換(如果存在)。

例如在上例中,空格可與左、上、下面的數字交換,分別變成:

5 2 8       5 2 _      5 2 8

1 _ 3       1 3 8      1 3 7

4 6 7       4 6 7      4 6 _

奇數碼遊戲是它的乙個擴充套件,在乙個n*n的網格中進行,其中n為奇數,1個空格和1~n*n-1這n*n-1個數恰好不重不漏地分布在n*n的網格中。

空格移動的規則與八數碼遊戲相同,實際上,八數碼就是乙個n=3的奇數碼遊戲。

現在給定兩個奇數碼遊戲的局面,請判斷是否存在一種移動空格的方式,使得其中乙個局面可以變化到另乙個局面。

多組資料,對於每組資料:

第1行乙個整數n,n<500,n為奇數。

接下來n行每行n個整數,表示第乙個局面。

接下來n行每行n個整數,表示第二個局面。

局面中每個整數都是0~n*n-1之一,其中用0代表空格,其餘數值與奇數碼遊戲中的意義相同,保證這些整數的分布不重不漏。

對於每組資料,若兩個局面可達,輸出tak,否則輸出nie。

3

1 2 3

0 4 6

7 5 8

1 2 3

4 5 6

7 8 010

0

tak

tak

八數碼問題的有解無解的結論:

乙個狀態表示成一維的形式,求出除0之外所有數字的逆序數之和,也就是每個數字前面比它大的數字的個數的和,稱為這個狀態的逆序。

若兩個狀態的逆序奇偶性相同,則可相互到達,否則不可相互到達。

n×n的棋盤,n為奇數時,與八數碼問題相同。

n為偶數時,空格每上下移動一次,奇偶性改變。稱空格位置所在的行到目標空格所在的行步數為空格的距離(不計左右距離),若兩個狀態的可相互到達,則有,兩個狀態的逆序奇偶性相同且空格距離為偶數,或者,逆序奇偶性不同且空格距離為奇數數。否則不能。

#include#define n 252500

using

namespace

std;

int a[255000],b[255000

];int

n;void updata(int x,int pos,intv)}

int sum(int x,int

pos)

return

ans;

}long

long f(int

x) }

return

ans;

}int

main()

return0;

}

view code

8數碼問題

8數碼問題,即在乙個3 3的矩陣中有8個數 1至8 和乙個空格,從乙個狀態轉換到另乙個狀態,每次只能移動與空格相鄰的乙個數字到空格當中 aoj 417 8數碼 這題是求轉化的最少步數,可用bfs解決,共有9 362880種情況,關鍵是如何標記已經訪問過的狀態,保證每次搜尋得到的狀態都是最小的步數,這...

八數碼問題

八數碼問題 一.八數碼問題 八數碼問題也稱為九宮問題。在3 3的棋盤,擺有八個棋子,每個棋子上標有1至8的某一數字,不同棋子上標的數字不相同。棋盤上還有乙個空格,與空格相鄰的棋子可以移到空格中。要求解決的問題是 給出乙個初始狀態和乙個目標狀態,找出一種從初始轉變成目標狀態的移動棋子步數最少的移動步驟...

八數碼問題

2 6 4 1 3 7 0 5 8 8 1 5 7 3 6 4 0 2 樣例輸出 還有就是重判的問題,如何重判呢?第一種方法 把排列變成整數,然後只開乙個一維陣列,也就是說設計一套排列的編碼和解碼函式,把0 8的全排列和0 362879的整數意義一一對應起來。時間效率高,但編碼解碼法適用範圍並不大,...