程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C說話金幣陣列成績處理辦法

C說話金幣陣列成績處理辦法

編輯:關於C++

C說話金幣陣列成績處理辦法。本站提示廣大學習愛好者:(C說話金幣陣列成績處理辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是C說話金幣陣列成績處理辦法正文


本文實例具體講述了C說話完成金幣陣列成績的處理辦法,分享給年夜家供年夜家參考。詳細辦法以下:

成績描寫:

有m*n(1 ≤ m, n ≤ 100)個金幣在桌面上排成一個 m 行 n 列的陣列。每枚金幣或正面朝上或後頭朝上。用數字表現金幣狀況,0表現金幣正面朝上,1 表現後頭朝上。

金幣陣列游戲的規矩是:

1. 每次可將任一行金幣翻過去放在本來的地位上;
2. 每次可任選 2 列,交流這 2 列金幣的地位。
本題請求關於給定的金幣陣列初始狀況和目的狀況,編程盤算按金幣游戲規矩,將金幣陣列從初始狀況變換到目的狀況所需的起碼變換次數。

數據輸出:

輸出的測試數據的第一行是一個不跨越 10 的正整數 k,表現有 k 個測試用例. 每一個測試用例的第一行是兩個正整數 m, n. 接上去是 m 行,每行有 n 個用空白符分隔的 0 或 1. 這 m*n 個 0-1 表現金幣的初始狀況陣列。最初是 m 行,每行 n 個 用空白符分隔的 0 或 1,表現金幣陣列的目的狀況。

數據輸入:

關於每一個測試用例,輸入一行包括一個整數,表現依照請求規矩將金幣陣列從初始狀況變換為目的狀況所須要的起碼變換次數。假如不克不及依照變換規矩將初始狀況變換為目的狀況(即無解時)則輸入 -1。

數據樣例:

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說話完成代碼以下:

#include "stdio.h"
#include "stdlib.h"
#define size 100
int num; //輸出幾組數據 
int row; //行數
int column; //列數
int count; //交流次數
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]) // 拷貝數組 
{
  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); //掩護原始數組b 
    min=row+column+1;
    for(j=0;j<column;j++){
     copy(b,c); //恢回復復興始數組b 
     count=0;  //交流次數清零 
     trans_column(0,j); //把每列都假定成為第一列的目的狀況,窮舉這column中情形 
     for(k=0;k<row;k++){ //假如行分歧,則將行轉換 
      if(a[k][0]!=b[k][0])
       trans_row(k);
     }
     for(k=0;k<column;k++){//窮舉其他一切列,假如雷同則交流,解釋目的狀況同一,不然找不到與該列雷同,解釋弗成行 
       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) //假如交流次數比初始值小,將其保留為以後組的最小交流次數,不然弗成完成交流 
     exchgmin[i]=min;
   else exchgmin[i]=-1;
  }
  for(i=0;i<num;i++)
   printf("%d/n",exchgmin[i]);
  system("pause");
  return 0;
}

願望本文所述對年夜家C法式算法設計的進修有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved