你一定玩過八數碼遊戲,它實際上是在乙個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~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 2 3
0 4 6
7 5 8
1 2 3
4 5 6
7 8 010
0輸出樣例:
taktak
思路:
兩個奇數碼逆序對奇偶性相同即可。
#include
#include
#include
using
namespace std;
typedef
long
long ll;
const
int maxn =
5e5+7;
ll a[maxn]
,b[maxn]
,ans;
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
,(1+ n)
>>
1,n)
; res1 = ans;
ans =
0;cnt =0;
for(
int i =
1;i <= m;i++
)merge(1
,(1+ n)
>>
1,n)
; res2 = ans;
if(res1 %
2== res2 %2)
else
}return0;
}
AcWing 108 奇數碼問題
題目描述 你一定玩過八數碼遊戲,它實際上是在乙個3 3的網格中進行的,1個空格和1 8這8個數字恰好不重不漏地分布在這3 3的網格中。例如 5 2 8 1 3 4 6 7在遊戲過程中,可以把空格與其上 下 左 右四個方向之一的數字交換 如果存在 例如在上例中,空格可與左 上 下面的數字交換,分別變成...
AcWing 108 奇數碼問題
原題鏈結 考察 歸併排序 n恒為奇數,所以左右上下移動不會改變逆序對的奇偶性.1 include 2 include 3 using namespace std 4const int n 250010 5 typedef long long ll 6 intn,a n b n tmp n 7void...
108 奇數碼問題
類似我們小時候玩過的數字華容道,就是有乙個缺的然後可以移動變成不同的樣子,本題要你解決的是從狀態一能否通過移動變到狀態二。一開始拿到題一看這不就八數碼公升級版嗎,然後改了下八數碼 t了,其實結論做法很簡單,但是如果沒做過類似的題,可能想不到這裡去,這道題需要用奇偶性。奇偶性很神奇,對於一類問題,如果...