演算法分析之金幣排列

2021-10-07 05:21:37 字數 1349 閱讀 8163

#include

using namespace std;

const

int n =

2e2+10;

const

int inf =

0x3f3f3f3f

;// 原陣列 source 目標陣列 aim 運算元組

int src[n]

[n], aim[n]

[n], tmp[n]

[n];

int n , m , cnt , ans ;

//判斷運算元組的某一列 是否和 目標陣列當前列 相符

bool samecol

(int c1 ,

int c2 )

return true;

}//操作1: 對運算元組 某一行金幣進行翻轉

void

filp

(int row )

cnt ++;}

//操作2: 對運算元組 某兩列進行交換

void

swapcol

(int c1 ,

int c2 )

cnt ++;}

void

input()

}for

(int i =

1; i <= n ; i++)}

}void

solve()

//以後不能再用「操作1-翻轉硬幣」,因為固定了第一列,

//如果使用一次「操作1-翻轉硬幣」,就會破壞當前第一列

//***剩下來的任務***:通過交換兩列,使得剩下來的都符合aim

bool successful_col ;

//外迴圈列舉aim陣列的列位置

for(

int k =

2; k <= m ; k ++

)//內迴圈列舉tmp陣列列的位置,前k列已經匹配,應從[k+1,m]選擇

for(

int j = k+

1; j <= m ; j ++)}

if(!successful_col )

break;}

if( successful_col && ans > cnt )}if

( ans != inf )

printf

("%d\n"

,ans)

;else

}int

main()

/*36

0000

0100

1111

0100

0000

0001

0111

0000

0010

*/

迴圈陣列之金幣

描述 國 王將金幣作為工資,發放給忠誠的騎士。第一天,騎士收到一枚金幣 之後兩天 第二天和第三天 裡,每天收到兩枚金幣 之後三天 第 四 五 六天 裡,每天 收到三枚金幣 之後四天 第 七 八 九 十天 裡,每天收到四枚金幣 這種工資發放模式會一直這樣延續下去 當連續n天每天收到n枚金幣後,騎士會在...

遞迴之全排列演算法

假設有這樣乙個序列,找出這個序列的所有全排列。第一位有 n 種可能性,確定了第一位後就是求解剩下 n 1 個資料的排列問題,這樣就可以往下一直分解問題,直到序列結尾處,也就是終止條件。1 2 3 2 1 3 3 2 1 暫不考慮序列元素重複問題,測試序列 include using namespac...

演算法課 金幣陣列問題

題意 給出01矩陣,請問是否能通過兩個操作使得 原01矩陣變換到目標的01矩陣 操作1 行變換 01翻轉 操作2 列變換 交換兩列 模擬題按順序模擬即可,第一步 必須找到某一列作為第一列,通過 0 次或多次的行變換變成與目標矩陣的第一列一樣。第二步 通過交換列,得到與目標矩陣一樣的。注意貪心交換無法...