【題意】
給出01矩陣,請問是否能通過兩個操作使得 原01矩陣變換到目標的01矩陣
操作1:行變換 —— 01翻轉
操作2:列變換 —— 交換兩列
模擬題按順序模擬即可,
第一步:必須找到某一列作為第一列,通過 0 次或多次的行變換變成與目標矩陣的第一列一樣。
第二步:通過交換列,得到與目標矩陣一樣的。
注意貪心交換無法達到最小步數
1 #include2view codeusing
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
*/
金幣陣列問題
問題描述 有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列金幣的位置。給定金幣的初始狀態和目標狀態,計算按金幣遊戲規則,將金幣陣列從初始狀態變換到目標狀態所需的最少變換次...