奇數碼問題

2021-10-02 20:23:12 字數 1832 閱讀 2987

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

例如:

528

13 _46

7

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

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

528

52 _ 528

1 _ 313

8137

4674

6746 _

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

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

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

輸入格式

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

第1行輸入乙個整數n,n為奇數。

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

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

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

輸出格式

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

資料範圍

1≤n<500

輸入樣例:31

2304

6758

1234

5678

0100

輸出樣例:

taktak

#include

#define ll long long

using

namespace std;

const

int n =

25e4+10

;int a[n]

, b[n]

;ll cnt1, cnt2;

int n;

void

merge

(int l,

int mid,

int r)

return;}

merge

(l,(l + mid)

>>

1, mid)

;merge

(mid +1,

(mid +

1+ r)

>>

1, r)

;int i = l, j = mid +1;

for(

int k = l; k <= r; k++)}

for(

int k = l; k <= r; k++

) a[k]

= b[k];}

intmain()

merge(1

,(n * n)

>>

1, n * n -1)

; cnt1 = cnt2, cnt2 =0;

for(

int i =

1, j =

0; i <= n * n; i++

)merge(1

,(n * n)

>>

1, n * n -1)

;if((cnt1 %2)

==(cnt2 %2)

)puts

("tak");

else

puts

("nie");

}return0;

}

奇數碼問題

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

108 奇數碼問題

類似我們小時候玩過的數字華容道,就是有乙個缺的然後可以移動變成不同的樣子,本題要你解決的是從狀態一能否通過移動變到狀態二。一開始拿到題一看這不就八數碼公升級版嗎,然後改了下八數碼 t了,其實結論做法很簡單,但是如果沒做過類似的題,可能想不到這裡去,這道題需要用奇偶性。奇偶性很神奇,對於一類問題,如果...

問題 N 奇數碼問題

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