AcWing 108 奇數碼問題

2021-09-13 01:30:02 字數 1992 閱讀 8509

題目描述:

你一定玩過八數碼遊戲,它實際上是在乙個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

輸入樣例:

3

1 2 3

0 4 6

7 5 8

1 2 3

4 5 6

7 8 010

0

輸出樣例:

tak

tak

分析:

解決本題的關鍵在於乙個結論,即:奇數碼遊戲兩個局面可達,當且僅當這兩個局面按行排成乙個乙個序列的逆序對數目的奇偶性相同。顯而易見,當空格在當前行左右移動,並不會改變其逆序對數目。對於第乙個局面1 2 3 0 4 6 7 5 8,0若上移得到0 2 3 1 4 6 7 5 8 0,相當於1向右跳了兩個位置,逆序對奇偶性必然不變。更一般的,對於n數碼問題,空格上(下)移,相當於乙個數向右(左)跳了n-1個位置,而n是奇數,所以不會影響逆序對的數目。所以不論空格如何移動,奇數碼局面的逆序對數目的奇偶性不變。

第一,對於0的處理,我們必須在讀入時跳過0,0不參與序列。

第二,複雜度,直接呼叫上一題的函式,發現超時了。上一題的merge函式輔助向量是定義在函式體內的,也就是區域性變數,這樣做的好處是每次遞迴會自動建立輔助向量,呼叫完自動銷毀。但是正是這個區域性的向量,會消耗大量的時間。本題是多組資料一起評測,所以,相當於多組奇數碼問題處理時間的總和要比較低。每乙個區域性變數建立銷毀的時間都可能被乘以十萬乃至上億次,何況還是向量。於是將輔助向量定義為全域性的陣列即可ac,節省了相當多的時間。

#include #include using namespace std;

typedef long long ll;

ll ans = 0;

int t[250010];

void merge(vector&v,int l,int r)

} while(i <= mid) t[p++] = v[i++];

while(j <= r) t[p++] = v[j++];

for(i = l;i <= r;i++) v[i] = t[i];

}int main()

for(int i = 0,j = 0;i <= s;i++)

ans = 0;

merge(a,0,s-1);

ll f;

f = ans,ans = 0;

merge(b,0,s-1);

ans += f;

if(ans % 2) cout<<"nie"

}

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

108 奇數碼問題

類似我們小時候玩過的數字華容道,就是有乙個缺的然後可以移動變成不同的樣子,本題要你解決的是從狀態一能否通過移動變到狀態二。一開始拿到題一看這不就八數碼公升級版嗎,然後改了下八數碼 t了,其實結論做法很簡單,但是如果沒做過類似的題,可能想不到這裡去,這道題需要用奇偶性。奇偶性很神奇,對於一類問題,如果...