思維 奇數碼問題

2022-05-10 02:45:45 字數 1350 閱讀 6162

給定奇數版, 和兩種狀態a b

問能否有解使板a 變為板 b

例:

1 2 3

0 4 6

7 5 8

1 2 3

4 5 6

7 8 0

解: 將板a, b化為一維向量, 

轉化為逆序對問題

首先去掉位0

有 1.空格的左右移動不影響整個串的順序

2.空格的上下移動必有等價與 swap(s[i], s[i - n - 1]) / swap(s[i], s[i + n - 1]) 

因為n - 1 為偶數, 所以逆序對的改變只能為偶數

由以上推導, 若a, b向量的 逆序對奇 偶性相同, 則必定可以轉換得解

/*

zeolim - an ac a day keeps the bug away

*///pragma gcc optimize(2)

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

typedef long long ll;

const int maxn = 1e6 + 10;

int arr[maxn];

int brr[maxn];

int revnum = 0;

void mergesort(int *arr, int fst, int lst, int *brr)

else

}for(i = fst; i < lst; i++)

arr[i] = brr[i]; }}

int main()

revnum = 0;

mergesort(arr, 0, n * n - 1, brr);

int ra = revnum;

for(int i = 0, j = 0, y; i < n * n; ++i)

revnum = 0;

mergesort(arr, 0, n * n - 1, brr);

int rb = revnum;

if((ra & 1) && (rb & 1) || (!(ra & 1) && !(rb & 1)))

cout<<"tak\n";

else

cout<<"nie\n";

}return 0;

}

思維 奇數碼問題

給定奇數版,和兩種狀態a b 問能否有解使板a 變為板 b 例 1 2 3 0 4 6 7 5 8 1 2 3 4 5 6 7 8 0 解 將板a,b化為一維向量,轉化為逆序對問題 首先去掉位0 有 1.空格的左右移動不影響整個串的順序 2.空格的上下移動必有等價與 swap s i s i n 1...

Ahahahahahahahaha 思維 奇偶性

題意 01串使得奇數字的和與偶數字的和相等,規定了輸入的長度為偶數。思路 考慮1的個數多還是0的個數多,取個數多的那乙個。如果個數多的是奇數個,就減1,不然就是偶數個必然能滿足條件。然後for一遍輸出一定個數的1也是遵守題目的出現順序。include include include include ...

奇數碼問題

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