類似我們小時候玩過的數字華容道,就是有乙個缺的然後可以移動變成不同的樣子,本題要你解決的是從狀態一能否通過移動變到狀態二。
一開始拿到題一看這不就八數碼公升級版嗎,然後改了下八數碼**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...