演算法課 金幣陣列問題

2022-06-20 00:00:14 字數 1866 閱讀 4607

【題意】

給出01矩陣,請問是否能通過兩個操作使得 原01矩陣變換到目標的01矩陣

操作1:行變換 —— 01翻轉

操作2:列變換 —— 交換兩列

模擬題按順序模擬即可,

第一步:必須找到某一列作為第一列,通過 0 次或多次的行變換變成與目標矩陣的第一列一樣。

第二步:通過交換列,得到與目標矩陣一樣的。

注意貪心交換無法達到最小步數

1 #include2

using

namespace

std;34

const

int n = 2e2+10;5

const

int inf = 0x3f3f3f3f;6

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

8int

src[n][n] , aim[n][n] , tmp[n][n] ;

9int

n , m , cnt , ans ;

1011

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

12bool samecol( int c1 , int

c2 )

18return

true;19

}2021//

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

22void filp( int

row )

26 cnt ++;27}

2829

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

30void swapcol( int c1 , int

c2 )

37 cnt ++;38}

3940

void

input()48}

4950

for( int i = 1 ; i <= n ; i++)54}

5556}57

58void

solve()

7778

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

79//

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

8081

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

8283

bool

successful_col ;

84//

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

85for( int k = 2 ; k <= m ; k ++)

9495

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

9697

for( int j = k+1 ; j <= m ; j ++)

103}

104105

if( !successful_col ) break

;106

}107

108if( successful_col && ans >cnt )

112}

113if( ans !=inf )

114 printf("

%d\n

",ans);

115else

118}

119int

main()

126/*

1273 6

128129

0 0 0 0 0 1

1300 0 1 1 1 1

1310 1 0 0 0 0

132133

0 0 0 0 0 1

1340 1 1 1 0 0

1350 0 0 0 1 0

136137

*/

view code

金幣陣列問題

問題描述 有m x n m 100,n 100 個金幣在桌面上排成乙個m行n 列的金幣陣列。每一枚金幣或正面朝上或背面朝上。用數字表示金幣狀態,0表示金幣正面朝上,1 表示背面朝上。金幣陣列遊戲的規則是 1 每次可將任一行金幣翻過來放在原來的位置上 2 每次可任選2 列,交換這2 列金幣的位置。程式...

金幣陣列問題

有m n枚金幣在桌面上排成乙個金幣陣列。每乙個金幣正面朝上,或背面朝上,分別用0和1表示。金幣陣列遊戲的規則是 1 每次可將任一行金幣翻過來放在原來的位置上 2 每次可任選2列,交換這2列金幣的位置。給定金幣的初始狀態和目標狀態,計算按金幣遊戲規則,將金幣陣列從初始狀態變換到目標狀態所需的最少變換次...

金幣陣列問題

有m n枚金幣在桌面上排成乙個金幣陣列。每乙個金幣正面朝上,或背面朝上,分別用0和1表示。金幣陣列遊戲的規則是 1 每次可將任一行金幣翻過來放在原來的位置上 2 每次可任選2列,交換這2列金幣的位置。給定金幣的初始狀態和目標狀態,計算按金幣遊戲規則,將金幣陣列從初始狀態變換到目標狀態所需的最少變換次...