108 奇數碼問題

2021-10-09 12:10:39 字數 1383 閱讀 5048

類似我們小時候玩過的數字華容道,就是有乙個缺的然後可以移動變成不同的樣子,本題要你解決的是從狀態一能否通過移動變到狀態二。

一開始拿到題一看這不就八數碼公升級版嗎,然後改了下八數碼**t了,其實結論做法很簡單,但是如果沒做過類似的題,可能想不到這裡去,這道題需要用奇偶性。奇偶性很神奇,對於一類問題,如果屬於同種性質(奇偶性相同),那麼它們就是完全相同(這個在某種意義上說)的。這道題在移動方塊時會改變拉直(將所有的行都排在一行)(一些移動問題都可以弄成一維來看,環的話可以斷成鏈來考慮)之後的順序,我們來看會不會發生奇偶性的改變,上移在拉直的形態中會跳過3個元素,所以並不改變逆序對個數的奇偶性。再看左右移,在拉直之後只會跳過乙個元素,完全不改變逆序對的個數。所以就是計算兩個方陣的逆序對的奇偶性,採用歸併排序統計個數。

#include

using

namespace std;

typedef

long

long ll;

const

int n =

510*

510+5;

int b[n]

, c[n]

, q[n]

,cnt;

void

merge

(int

* a,

int l,

int mid,

int r)

int i = l, j = mid +

1, k = l;

while

(i <= mid && j <= r)

else

}while

(i <= mid) a[k++

]= q[i++];

while

(j <= r) a[k++

]= q[j++];

}void

mergesort

(int

* a,

int l,

int r)

}int

main()

sum =0;

for(

int i=

1;i<=n*n;i++

)mergesort

(b,1

,n*n-1)

;int ans1 = cnt;

cnt =0;

mergesort

(c,1

,n*n-1)

;int ans2 = cnt;if(

abs(ans1-ans2)%2

==0)else

}}

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...

ACWING108 奇數碼問題(逆序對)

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