搜尋 金幣陣列問題

2021-10-05 13:09:59 字數 1770 閱讀 7048

問題描述:

有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列金幣的位置。給定金幣的初始狀態和目標狀態,計算按金幣遊戲規則,將金幣陣列從初始狀態變換到目標狀態所需的最少變換次...