亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C語言金幣陣列問題解決方法

 更新時間:2014年09月16日 15:28:40   投稿:shichen2014  
這篇文章主要介紹了C語言金幣陣列問題解決方法,主要涉及數(shù)組的靈活運算,是一類非常經典的算法,需要的朋友可以參考下

本文實例詳細講述了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程序算法設計的學習有所幫助。

相關文章

  • C語言的基本語法詳解

    C語言的基本語法詳解

    本篇文章主要講解C語言 基本語法,這里提供簡單的示例和代碼來詳細講解C語言的基本語法,開始學習C語言的朋友可以看一下,希望能夠給你帶來幫助
    2021-09-09
  • C++中需要注意的細節(jié)你知道嗎

    C++中需要注意的細節(jié)你知道嗎

    這篇文章主要介紹了C++ 需要注意的幾點細節(jié),幫助大家更好的理解和學習C++,感興趣的朋友可以了解下,希望能夠給你帶來幫助
    2021-09-09
  • C語言超詳細講解排序算法上篇

    C語言超詳細講解排序算法上篇

    時間如流水,今天就到初階數(shù)據(jù)結構最后一個知識章節(jié)了,常見的排序算法!在進入這期之前,程愛打籃球的程序猿想說一句,如果有不懂的地方可以反復觀看我之前的內容,再還有不懂可以直接找我,幫你安排的妥妥的
    2022-03-03
  • C++?Boost?StringAlgorithms超詳細講解

    C++?Boost?StringAlgorithms超詳細講解

    Boost是為C++語言標準庫提供擴展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標準庫的后備,是C++標準化進程的開發(fā)引擎之一,是為C++語言標準庫提供擴展的一些C++程序庫的總稱
    2022-11-11
  • 深入理解二叉樹的非遞歸遍歷

    深入理解二叉樹的非遞歸遍歷

    本篇文章是對二叉樹的非遞歸遍歷進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C++數(shù)據(jù)結構繼承的概念與菱形繼承及虛擬繼承和組合

    C++數(shù)據(jù)結構繼承的概念與菱形繼承及虛擬繼承和組合

    今天我要給大家介紹C++中更深入的內容了。C++這門語言為了使代碼不冗余,做了些什么操作呢?C++的繼承就很好地實現(xiàn)了類層次的代碼復用,今天我就要來和大家好好聊一聊它了
    2022-02-02
  • c++超細致講解引用

    c++超細致講解引用

    在我們日常的生活中每個人都或多或少存在一個"外號",例如《西游記》中孫悟空就有諸多外號:美猴王,孫行者,齊天大圣等等。那么在C++中,也可以給一個已經存在的變量取別名,這就是引用。那么接下來深入來探討一下引用
    2022-05-05
  • C語言編程C++動態(tài)內存分配示例講解

    C語言編程C++動態(tài)內存分配示例講解

    這篇文章主要介紹了C語言編程C++動態(tài)內存分配示例講解,為什么存在動態(tài)內存分配?本文通過動態(tài)內存介紹及常見內存錯誤等示例來為大家講解
    2021-09-09
  • C語言char s[]和char* s的區(qū)別

    C語言char s[]和char* s的區(qū)別

    本文主要介紹了C語言char s[]和char* s的區(qū)別,詳細講述了數(shù)組,指針的使用,具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-06-06
  • 使用C++實現(xiàn)迷宮游戲

    使用C++實現(xiàn)迷宮游戲

    這篇文章主要為大家詳細介紹了C++實現(xiàn)迷宮游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03

最新評論