CH0503 奇數碼問題(逆序對)

2021-10-08 22:36:54 字數 1173 閱讀 9675

題面:奇數碼問題

思路:找了好久,沒有找到奇數碼問題和 n∗m

n*mn∗

m 數碼問題的詳細證明。先記個結論。

奇數碼遊戲兩個局面可達,當且僅當兩個局面下網路中的數依次寫成不含零的 1

11 到 n∗n

−1

n*n-1

n∗n−

1 的序列後,逆序對個數的奇偶性相同。

結論必要性證明:空格(即 0

00 )左右移動的時候,我們列出出來的序列是不變的;空格上(下)移動時,相當於某個數與它後(前)邊 n−1

n-1n−

1 個數交換了位置,因為 n−1

n-1n−

1 是偶數,所以逆序對數的變化也是乙個偶數。

拓展到 n

nn 為偶數的情況,此時兩個局面可達,當且僅當兩個局面對應的網路寫成序列之後,「

「「逆序對數之差」

」」和「

「「兩個局面下空格所在的行數之差」

」」奇偶性相同。

n ∗m

n*mn∗

m 數碼問題也是根據上面兩個結論來進行判定有解性的。具體的,慢慢找。

**:

#include

#define sc scanf

#define pf printf

using

namespace std;

const

int n =

250010

;int a[n]

, b[n]

, w[n]

;//歸併排序求逆序對數

intmerge

(int l,

int r,

int x)

}while

(i <= mid) w[k++

]= x[i++];

while

(j <= r) w[k++

]= x[j++];

for(i = l, j =

0; i <= r; i++

, j++

) x[i]

= w[j]

;return res;

}void

read

(int

*x,int len)

}int

main()

}

CH0503 奇數碼問題 逆序對

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

奇數碼問題 逆序數

時間限制 1 sec 記憶體限制 128 mb 提交 69 解決 23 提交 狀態 討論版 命題人 admin 題目描述 你一定玩過八數碼遊戲,它實際上是在乙個3 3的網格中進行的,1個空格和1 8這8個數字恰好不重不漏地分布在這3 3的網格中。例如 5 2 8 1 3 4 6 7 在遊戲過程中,可...

逆序對 cofun1917 奇數碼問題

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