C語言金幣陣列問題解決方法
本文實例詳細講述了C語言實現(xiàn)金幣陣列問題的解決方法,分享給大家供大家參考。具體方法如下:
問題描述:
有m*n(1 ≤ m, n ≤ 100)個金幣在桌面上排成一個 m 行 n 列的陣列。每一枚金幣或正面朝上或背面朝上。用數(shù)字表示金幣狀態(tài),0表示金幣正面朝上,1 表示背面朝上。
金幣陣列游戲的規(guī)則是:
1. 每次可將任一行金幣翻過來放在原來的位置上;
2. 每次可任選 2 列,交換這 2 列金幣的位置。
本題要求對于給定的金幣陣列初始狀態(tài)和目標狀態(tài),編程計算按金幣游戲規(guī)則,將金幣陣列從初始狀態(tài)變換到目標狀態(tài)所需的最少變換次數(shù)。
數(shù)據(jù)輸入:
輸入的測試數(shù)據(jù)的第一行是一個不超過 10 的正整數(shù) k,表示有 k 個測試用例. 每個測試用例的第一行是兩個正整數(shù) m, n. 接下來是 m 行,每行有 n 個用空白符分隔的 0 或 1. 這 m*n 個 0-1 表示金幣的初始狀態(tài)陣列。最后是 m 行,每行 n 個 用空白符分隔的 0 或 1,表示金幣陣列的目標狀態(tài)。
數(shù)據(jù)輸出:
對于每個測試用例,輸出一行包含一個整數(shù),表示按照要求規(guī)則將金幣陣列從初始狀態(tài)變換為目標狀態(tài)所需要的最少變換次數(shù)。如果不能按照變換規(guī)則將初始狀態(tài)變換為目標狀態(tài)(即無解時)則輸出 -1。
數(shù)據(jù)樣例:
Sample Input
2
4 3
1 0 1
0 0 0
1 1 0
1 0 1
1 0 1
1 1 1
0 1 1
1 0 1
4 3
1 0 1
0 0 0
1 0 0
1 1 1
1 1 0
1 1 1
0 1 1
1 0 1
Sample Output
2
-1
C語言實現(xiàn)代碼如下:
#include "stdio.h"
#include "stdlib.h"
#define size 100
int num; //輸入幾組數(shù)據(jù)
int row; //行數(shù)
int column; //列數(shù)
int count; //交換次數(shù)
int min;
int a[size][size]; //初始矩陣
int b[size][size]; //最終矩陣
int c[size][size]; //臨時存放矩陣
int found; //初始到最終是否有交換
void trans_row(int x) // 第x行取反
{
int i;
for (i = 0;i<column; i++)
b[x][i] = b[x][i]^1; // 異或取反
count++;
}
void trans_column(int x, int y) // 交換x和y列
{
int i;
int temp;
for(i = 0; i < row; i++){
temp=b[i][x];
b[i][x]=b[i][y];
b[i][y]=temp;
}
if (x != y)
count++;
}
int is_same(int x, int y) //比較x和y列是否相同
{
int i;
for(i = 0; i <row; i++)
if (a[i][x] != b[i][y])
return 0;
return 1;
}
void copy(int a[size][size], int b[size][size]) // 拷貝數(shù)組
{
int i,j;
for (i = 0; i <row; i++)
for (j = 0; j < column; j++)
a[i][j] = b[i][j];
}
int main(){
int i,j,k,p;
int exchgmin[size];
scanf("%d",&num);
for(i=0;i<num;i++){
scanf("%d",&row);
scanf("%d",&column);
for(j=0;j<row;j++)
for(k=0;k<column;k++)
scanf("%d",&a[j][k]);
for(j=0;j<row;j++)
for(k=0;k<column;k++)
scanf("%d",&b[j][k]);
copy(c,b); //保護原始數(shù)組b
min=row+column+1;
for(j=0;j<column;j++){
copy(b,c); //恢復原始數(shù)組b
count=0; //交換次數(shù)清零
trans_column(0,j); //把每一列都假設成為第一列的目標狀態(tài),窮舉這column中情況
for(k=0;k<row;k++){ //如果行不同,則將行轉換
if(a[k][0]!=b[k][0])
trans_row(k);
}
for(k=0;k<column;k++){//窮舉其他所有列,如果相同則交換,說明目標狀態(tài)統(tǒng)一,否則找不到與該列相同,說明不可行
found=0;
for(p=k;p<column;p++){
if(is_same(k,p)){
trans_column(k,p);
found=1;
break;
}
}
if(!found)
break;
}
if(found&&count<min) //如果可行,找出最小值
min=count;
}
if(min<row+column+1) //如果交換次數(shù)比初始值小,將其保存為當前組的最小交換次數(shù),否則不可實現(xiàn)交換
exchgmin[i]=min;
else exchgmin[i]=-1;
}
for(i=0;i<num;i++)
printf("%d/n",exchgmin[i]);
system("pause");
return 0;
}
希望本文所述對大家C程序算法設計的學習有所幫助。
相關文章
更優(yōu)雅的C++字符串格式化實現(xiàn)方法詳解
在用C++編寫代碼時,經(jīng)常需要用到字符串拼接及格式化,尤其是在拼寫sql語句時。所以本文為大家介紹了更優(yōu)雅的C++字符串格式化實現(xiàn)方法,希望對大家有所幫助2023-04-04
C語言數(shù)據(jù)結構之動態(tài)分配實現(xiàn)串
這篇文章主要介紹了C語言數(shù)據(jù)結構之動態(tài)分配實現(xiàn)串的相關資料,希望通過本文能幫助到大家,讓大家實現(xiàn)數(shù)據(jù)結構中動態(tài)分配實現(xiàn)串的實例,需要的朋友可以參考下2017-10-10
C++ 將字符串值賦給CHAR數(shù)組的實現(xiàn)
這篇文章主要介紹了C++ 將字符串值賦給CHAR數(shù)組的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01

