金币阵列问题

题目不在描述,见计算机算法设计与分析习题解答(第二版)王晓东 第6页

/*
 * CoinSort.cpp
 *
 *  Created on: Dec 4, 2014
 *      Author: hujianjie
 */
#include<iostream>
using namespace std;
int Max = 10;
int n, m, count, best;
bool flag;
int arrOld[10][10];
int arrNew[10][10];
int arrMid[10][10];

void copy(int arr1[10][10], int arr2[10][10]) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            arr1[i][j] = arr2[i][j];
        }
    }
}
void transRow(int row) {
    for (int i = 0; i < m; i++) {
        //    arrNew[row][i] = arrNew[row][i] ^ 1;
        arrOld[row][i] = arrOld[row][i] ^ 1;
    }
    cout << "transRow" << endl;
    count++;

}
void transColum(int mid, int tem) {
    int temp;
    for (int k = 0; k < n; k++) {
        //temp = arrNew[k][mid];
        //arrNew[k][mid] = arrNew[k][tem];
        //arrNew[k][tem] = temp;
        temp = arrOld[k][mid];
        arrOld[k][mid] = arrOld[k][tem];
        arrOld[k][tem] = temp;
    }
    cout << "transColum" << endl;
    count++;

}
bool isSame(int mid, int tem) {
    for (int k = 0; k < n; k++) {
        if (arrOld[k][tem] != arrNew[k][mid]) {
            return false;
        }
    }
    return true;
}

int main() {
    flag = false;
    count = 0;
    cout << "Please input row n and colum m !" << endl;
    cin >> n >> m;
    cout << "Please input old  !" << endl;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> arrOld[i][j];
        }
    }
    cout << "Please input New  !" << endl;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> arrNew[i][j];
        }
    }
    //copy(arrMid, arrNew);
    copy(arrMid, arrOld);
    best = n + m + 1;
    for (int colum = 0; colum < m; colum++) {
        cout << colum << endl;
        //copy(arrNew,arrMid);
        copy(arrOld, arrMid);
        count = 0;
        //将每一列转换成第一列
        if (colum != 0)
            transColum(0, colum);
        //比较第一列的每一行,不同的则将其取反
        for (int row = 0; row < n; row++) {
            if (arrNew[row][0] != arrOld[row][0]) {
                transRow(row);
            }
        }
        //在第一行确定并翻转之后,比较剩下的列
        for (int mid = 1; mid < m; mid++) {
            for (int tem = mid; tem < m; tem++) {
                if (isSame(mid, tem)) {
                    if (mid != tem)
                        transColum(mid, tem);
                    flag = true;

} else {
                    flag = false;
                }
            }
        }
        if (flag == true && count < best)
            best = count;
    }
    if (best < (m + n + 1))
        cout << "The best steps are : " << best << endl;
    else
        cout << "Can‘t finished! " << endl;
    return 0;
}
/*
 1 0 1
 0 0 0
 1 1 0
 1 0 1
 *
 *
 1 0 1
 1 1 1
 0 1 1
 1 0 1
 *
 *
 *
 *
 */
C 语言写的不好,思路是:将初始矩阵的每一列尝试作为目标的第一列,按枚举的思路一列一列的比较

时间: 2024-10-11 00:12:31

金币阵列问题的相关文章

【算法课】金币阵列问题

金币阵列问题 [题意] 给出01矩阵,请问是否能通过两个操作使得 原01矩阵变换到目标的01矩阵 操作1:行变换 —— 01翻转 操作2:列变换 —— 交换两列 [考察] 模拟题 [题解] 按顺序模拟即可, 第一步:必须找到某一列作为第一列,通过 0 次或多次的行变换变成与目标矩阵的第一列一样. 第二步:通过交换列,得到与目标矩阵一样的. 注意贪心交换无法达到最小步数 1 #include<bits/stdc++.h> 2 using namespace std; 3 4 const int

【1-4】金币阵列问题

问题描述: 有m ′ n(m £ 100,n £ 100) 个金币在桌面上排成一个m 行 n 列的金币阵列.每一枚金 币或正面朝上或背面朝上.用数字表示金币状态,0 表示金币正面朝上,1 表示背面朝上. 金币阵列游戏的规则是: (1)每次可将任一行金币翻过来放在原来的位置上: (2)每次可任选 2 列,交换这 2 列金币的位置. ′编程任务: 给定金币阵列的初始状态和目标状态,编程计算按金币游戏规则,将金币阵列从初始状 态变换到目标状态所需的最少变换次数. ′数据输入: 由文件 input.tx

《计算机算法设计与分析》v4 第1章 算法概述 算法实现题答案

博主今年刚上大三,正好开算法这门课.由于博主本人比较喜欢算法但又比较懒,啃不动算法导论,所以决定拿这本书下手. 这本书是王晓东的第四版<计算机算法设计与分析>.初步打算将每章后面的算法题都用代码实现. 有些题跟某个ACM题目很像,我会把该ACM题的链接贴上.有的题没OJ交所以可能是错的.如有发现,还望指出. 1-1 统计数字问题 http://poj.org/problem?id=2282 这个题要按位分解,一位一位的来处理. #include<iostream> #include

求不相邻金币相加和的最大值--动态规划1

求不相邻金币相加和的最大值. 输入n个金币的金币面值(正数自定义),求这些金币不相邻和的最大值. 动态规划问题1 设f(n)为第n个金币数的最大值,f(0)=0,f(1)=a[1],输入的数组从下标为1开始. f(n)=max{a[n]+f(n-2),f(n-1)}. 代码如下: import java.util.Scanner; public class Jin_bi_zui_da_zhi { public static void main(String[] args) { Scanner s

SERVERAID 8K和8K-L阵列卡在添加新硬盘时会丢失阵列配置信息

客户有一台IBM X3400需要扩容本地硬盘,去之前以为和IBM x3650M4等服务器类似,就没有多查资料,到现场后发现阵列卡型号是SERVERAID 8K,整个配置界面与x3650M4 的webbios配置阵列卡完全不同,没敢贸然操作,上网查了查资料,一些注意的地方和大家分享一下. 使用ARC配置ServeRAID_8k-l8k8i图文手册,已经上传到这里http://down.51cto.com/data/1357299 适用机型: 所有System x3400; 所有System x35

【linux相识相知】独立硬盘冗余阵列-RAID

独立硬盘冗余阵列(RAID,Redundant Array of Independant Disks),旧称为廉价磁盘冗余阵列(Redundant Array of Inexpensive Disks).1987年美国加州伯克利分校的一篇名为<A Case for Redundant Arrays of Inexpensive Disk(RAID)>论文诞生,这标志着RAID技术的开始. 那么什么是RAID呢?简单的来讲就是把多个硬盘组合起来,成为一个硬盘阵列组,操作系统会把它当做是一个硬盘,

RAID阵列

RAID阵列 一. RAID简介 RAID全称为Redundant Array of Disks,是"独立磁盘冗余阵列"(最初为"廉价磁盘冗余阵列")的缩略语.1987年由Patterson,Gibson和Katz在加州大学伯克利分院的一篇文章中定义.RAID阵列技术允许将一系列磁盘分组,以实现为数据保护而必需的数据冗余,以及为提高读写性能而形成的数据条带分布.RAID最初用于高端服务器市场,不过随着计算机技术的快速发展,RAID技术已经渗透到计算机遍布的各个领域.

noi 1.5 45:金币

描述 国王将金币作为工资,发放给忠诚的骑士.第一天,骑士收到一枚金币:之后两天(第二天和第三天)里,每天收到两枚金币:之后三天(第四.五.六天)里,每天收到三枚金币:之后四天(第七.八.九.十天)里,每天收到四枚金币--这种工资发放模式会一直这样延续下去:当连续N天每天收到N枚金币后,骑士会在之后的连续N+1天里,每天收到N+1枚金币(N为任意正整数). 你需要编写一个程序,确定从第一天开始的给定天数内,骑士一共获得了多少金币. 输入 一个整数(范围1到10000),表示天数. 输出 骑士获得的

不同容量硬盘创建raid 10阵列案例解析

情景:在DELL 5/i或6/i阵列卡中,有2块146G盘(插槽号0 ~ 1),4块300G盘(插槽号2~5),共6块.现在想要创建raid 10阵列,那么最后阵列总容量是多大呢? 解析:按照常规理解,这种模式下,应该是以最小硬盘的容量为准,既146*3 = 438G的容量.但实际上,却并非如此,而是:146+300*2 = 746的容量,这是为什么呢? 其实产生这个结果是个凑巧,因为此时的阵列是这样做的: 0 ó(镜像) 1 => 条带1 2 ó(镜像) 3 => 条带2 4 ó(镜像) 5