逆序對 cofun1917 奇數碼問題

2021-08-10 04:18:33 字數 1712 閱讀 9624

description

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

例如:

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 _

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

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

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

input format

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

第1行乙個奇整數n。

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

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

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

output format

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

sample input

3 1 2 3

0 4 6

7 5 8

1 2 3

4 5 6

7 8 0

1 0

0sample output

tak

takhint

資料範圍與約定

對於30%的資料,1<=n<=3;

對於60%的資料,1<=n<=50;

對於100%的資料,1<=n<=500,n為奇數,每個測試點不超過10組。

#include

using

namespace

std;

int n, i, j, x, s1, s2, c[250005];

inline

int read()

while(ch >= '0' && ch <= '9')

x = x * 10 + ch - '0', ch = getchar();

return x * w;

} //讀入優化

inline

int lowbit(int x)

inline

int work(int x)

inline

void add(int x)

int main()

; }

memset(c, 0, sizeof(c));

for(i = j = 1, s2 = 0; i <= n; ++ i);}

if ((s1 & 1) == (s2 & 1)) printf("tak\n");else

printf("nie\n");

}return

0; }

CH0503 奇數碼問題 逆序對

此題有結論 兩個局面可以互達的充要條件是寫出一列去掉 0 00 後,逆序對數奇偶性相同。因為有奇數列,可以發現,無論怎麼移動,逆序對數的奇偶性不發生改變,然而其充分性不易證明,記住即可。include include inline intread const int maxn 505 int n,b...

ACWING108 奇數碼問題(逆序對)

你一定玩過八數碼遊戲,它實際上是在乙個3 3的網格中進行的,1個空格和1 8這8個數字恰好不重不漏地分布在這3 3的網格中。例如 5 2 8 1 3 4 6 7 在遊戲過程中,可以把空格與其上 下 左 右四個方向之一的數字交換 如果存在 例如在上例中,空格可與左 上 下面的數字交換,分別變成 5 2...

CH0503 奇數碼問題(逆序對)

題面 奇數碼問題 思路 找了好久,沒有找到奇數碼問題和 n m n mn m 數碼問題的詳細證明。先記個結論。奇數碼遊戲兩個局面可達,當且僅當兩個局面下網路中的數依次寫成不含零的 1 11 到 n n 1 n n 1 n n 1 的序列後,逆序對個數的奇偶性相同。結論必要性證明 空格 即 0 00 ...