奇數碼問題 逆序數

2021-08-21 15:20:33 字數 1612 閱讀 2227

時間限制: 1 sec  記憶體限制: 128 mb

提交: 69  解決: 23

[提交] [狀態] [討論版] [命題人:admin]

題目描述

你一定玩過八數碼遊戲,它實際上是在乙個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~n*n-1這n*n-1個數恰好不重不漏地分布在n*n的網格中。

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

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

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

第1行乙個整數n,n<500,n為奇數。

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

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

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

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

樣例輸入

3

1 2 3

0 4 6

7 5 8

1 2 3

4 5 6

7 8 010

0

樣例輸出

tak

tak

[提交][狀態]

奇數碼兩個局面可達,當且僅當數字寫成一行後逆序數的奇偶性相同

當n為偶數時,當且僅當數字寫成序列後 逆序數個數之差 與 兩個局面空格之間的行數之差 的奇偶性相同

所以,該題轉換為求逆序數,除了歸併排序外,可以用樹狀陣列來求

(居然因為scanf忘加~ 輸出超限了無數次)

**:

#include using namespace std;

const int maxx=550;

const int inf=99999999;

const int mod=1e9+7;

typedef long long ll;

int d[maxx*maxx];

int n;

void add(int x)

}int sum(int x)

return sum;

}int main()

}for(int i = 0; i <= n*n; ++i) d[i]=0;

for(int i=1; i<=n*n; i++)

}printf("%s\n", ans1==ans2?"tak":"nie");

}return 0;

}

問題 O 奇數碼問題(求逆序數,樹狀陣列)

題目 思路 利用結論兩個數碼的逆序數奇偶性相同即可變為相同的局面,否則不可 updata 和getsum 是樹狀陣列的更新和求和操作,slove 是求逆序數的函式 include include include using namespace std int n,c 300005 inline in...

逆序對 cofun1917 奇數碼問題

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

CH0503 奇數碼問題 逆序對

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