a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C > 正文

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

2020-01-26 15:18:52
字體:
供稿:網(wǎng)友

本文實例詳細講述了C語言實現(xiàn)金幣陣列問題的解決方法,分享給大家供大家參考。具體方法如下:

問題描述:

有m*n(1 ≤ m, n ≤ 100)個金幣在桌面上排成一個 m 行 n 列的陣列。每一枚金幣或正面朝上或背面朝上。用數(shù)字表示金幣狀態(tài),0表示金幣正面朝上,1 表示背面朝上。

金幣陣列游戲的規(guī)則是:

1. 每次可將任一行金幣翻過來放在原來的位置上;
2. 每次可任選 2 列,交換這 2 列金幣的位置。
本題要求對于給定的金幣陣列初始狀態(tài)和目標(biāo)狀態(tài),編程計算按金幣游戲規(guī)則,將金幣陣列從初始狀態(tài)變換到目標(biāo)狀態(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,表示金幣陣列的目標(biāo)狀態(tài)。

數(shù)據(jù)輸出:

對于每個測試用例,輸出一行包含一個整數(shù),表示按照要求規(guī)則將金幣陣列從初始狀態(tài)變換為目標(biāo)狀態(tài)所需要的最少變換次數(shù)。如果不能按照變換規(guī)則將初始狀態(tài)變換為目標(biāo)狀態(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 100int 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); //恢復(fù)原始數(shù)組b      count=0;  //交換次數(shù)清零      trans_column(0,j); //把每一列都假設(shè)成為第一列的目標(biāo)狀態(tài),窮舉這column中情況      for(k=0;k<row;k++){ //如果行不同,則將行轉(zhuǎn)換       if(a[k][0]!=b[k][0])       trans_row(k);     }     for(k=0;k<column;k++){//窮舉其他所有列,如果相同則交換,說明目標(biāo)狀態(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ù)比初始值小,將其保存為當(dāng)前組的最小交換次數(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程序算法設(shè)計的學(xué)習(xí)有所幫助。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 国产黄色大片 | 亚洲国产成人精品女人久久久 | 亚洲国产精品99久久久久久久久 | 久久久久久久久久久免费视频 | 国产成人在线看 | 91久久精品www人人做人人爽 | 超碰97免费在线 | 日本中文字幕免费 | 亚洲精品一区二区三区 | 成人在线视频播放 | 激情亚洲婷婷 | 天天干天天操 | 久久久久国产 | 亚洲成人av| 日本亚洲欧美 | 欧美jizz18性欧美 | 三级免费网站 | 国产精品国产精品国产专区不片 | 98精品国产高清在线xxxx天堂 | 久久噜噜噜精品国产亚洲综合 | 黄色高清视频在线观看 | 国产大片在线观看 | 国产精品久久久久影院 | 午夜av在线播放 | 涩涩婷婷 | 高清国产一区二区三区 | 国产高清中文字幕 | 精品一区二区三区在线观看 | 久久国产精品视频 | 亚洲免费一区 | 中文字幕久久综合 | 天天草夜夜操 | 国产精品一二三区 | 久久久一 | 最新中文字幕在线观看 | 成人欧美| 国产成人影院在线观看 | 亚洲女人天堂成人av在线 | 国产精品久久精品久久 | 欧美激情欧美激情在线五月 | 国产偷国产偷精品高清尤物 |