問題描述:
有m x n (m<=100, n<=100 ) 個金幣在桌面上排成乙個m行n 列的金幣陣列。每一枚金幣或正面朝上或背面朝上。用數字表示金幣狀態,0表示金幣正面朝上,1 表示背面朝上。金幣陣列遊戲的規則是:
每次可將任一行金幣翻過來放在原來的位置上;
每次可任選2 列,交換這2 列金幣的位置。
演算法設計:
給定金幣陣列的初始狀態和目標狀態,計算按金幣遊戲規則,將金幣陣列從初始狀態變換到目標狀態所需的最少變換次數。
資料輸入:
由檔案input.txt給出輸入資料。檔案中有多組資料。檔案的第1行有1 個正整數k,表示有k 組資料。每組資料的第1 行有2 個正整數m 和n。以下的m行是金幣陣列的初始狀態,每行有n 個數字表示該行金幣的狀態,0 表示金幣正面朝上,1 表示背面朝上。接著的m行是金幣陣列的目標狀態。
結果輸出:
將計算出的最少變換次數按照輸入資料的次序輸出到檔案output.txt。相應資料無解時輸出-1。
輸入檔案示例 輸出檔案示例
input.txt
2
4 31 0 1
0 0 0
1 1 0
1 0 1
1 0 1
1 1 1
0 1 1
1 0 1
4 31 0 1
0 0 0
1 0 0
1 1 1
1 1 0
1 1 1
0 1 1
1 0 1
output.txt
2
-1
#include
#include
#include
using
namespace std;
const
int inf =
0x3f3f3f3f
;typedef
long
long ll;
const
int maxn =15;
int m, n;
int src[maxn]
[maxn]
, des[maxn]
[maxn]
;int cnt, tmp[maxn]
[maxn]
;void
copy
(int a[maxn]
[maxn]
,int b[maxn]
[maxn]
)void
flipbyrow
(int r)
void
exchangebycolumn
(int c1,
int c2)
bool
same
(int c1,
int c2)
intmain()
if(!found)
break;}
if(found && best > cnt)
best = cnt;}if
(best < m + n +1)
cout << best <<
"\n"
;else
cout <<
"-1\n";}
return0;
}
金幣陣列問題
問題描述 有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列金幣的位置。給定金幣的初始狀態和目標狀態,計算按金幣遊戲規則,將金幣陣列從初始狀態變換到目標狀態所需的最少變換次...