[递归] 平衡矩阵

这篇具有很好参考价值的文章主要介绍了[递归] 平衡矩阵。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

平衡矩阵

题目描述

现在有一个n阶正整数方阵(n<=7),现在可以对矩阵的任意一行进行左移,具体操作为:每次对于某一行a_i1,a_i2,…,a_in进行一次左移,最左边的元素移动到这一行的末尾,其他元素均向左移动一位,即变为a_i2,a_i3,…,a_in,a_i1。对某一行可以执行任意次的左移。
现在我们的目标是:通过对矩阵的每一行进行若干次左移,使得矩阵中每列和的最大值最小。

关于输入

输入包含多组数据。
对于每组数据,第一行为一个正整数n(1<=n<=7),代表矩阵的阶。接下来的n行,每行n个正整数(不超过10000),代表这个矩阵。
输入数据以一个-1为结尾代表输入结束。

关于输出

对于每组数据,输出一行一个正整数,为最小的最大列和。

例子输入
2
4 6
3 7
3
1 2 3
4 5 6
7 8 9
-1
例子输出
11
15
解题分析

主要思路是,通过深度优先搜索遍历所有可能的矩阵状态,然后在所有状态中找到最小的最大列和。在搜索过程中,我们对每一行进行所有可能的左移操作,并通过更新最小的最大列和来保证找到的是最优解。

代码实现
#include <iostream>
using namespace std;

int m[8][8]={0};
int n;
int result;
int flag=0;

void zy(int m[8][8],int row){
    int temp1=m[row][0];
    for(int i=0;i<n-1;i++){
        m[row][i]=m[row][i+1];
    }
    m[row][n-1]=temp1;
}

int getmax(int m[8][8]){
    int max1=0;
    for(int i=0;i<n;i++){
        int sum=0;
        for(int j=0;j<n;j++){
            sum+=m[j][i];
        }
        max1=max1>sum?max1:sum;
    }
    return max1;
}

void dfs(int m[8][8],int row){
    if(row==n){
        return;
    }
    for(int i=0;i<n;i++){
        zy(m,row);
        int a=getmax(m);
        result=result<a?result:a;
        dfs(m,row+1);
    }
}

int main() {
    while(cin>>n){
        if(n==-1) break;
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++){
                cin>>m[i][j];
            }
        result=getmax(m);
        dfs(m,0);
        cout<<result<<endl;
    }
	return 0;
}
进一步解释

这个程序的主要目标是通过对矩阵的每一行进行若干次左移,使得矩阵中每列和的最大值最小。程序采用了深度优先搜索(DFS)的方法来实现这个目标。

以下是程序的详细解释:

1. **全局变量的定义**

```c++
int m[8][8] = {0};
int n;
int result;
int flag = 0;
```

`m` 是一个二维数组,用于存储输入的矩阵;`n` 是矩阵的阶数;`result` 用于存储当前找到的最小的最大列和;`flag` 是一个标志变量,用于标记搜索过程中的状态。

2. **左移操作函数**

```c++
void zy(int m[8][8], int row) {
    int temp1 = m[row][0];
    for (int i = 0; i < n - 1; i++) {
        m[row][i] = m[row][i + 1];
    }
    m[row][n - 1] = temp1;
}
```

`zy` 函数实现了对矩阵中一行的左移操作。它首先保存第一个元素,然后把后面的元素向前移动一位,最后把保存的第一个元素放到最后。

3. **计算最大列和函数**

```c++
int getmax(int m[8][8]) {
    int max1 = 0;
    for (int i = 0; i < n; i++) {
        int sum = 0;
        for (int j = 0; j < n; j++) {
            sum += m[j][i];
        }
        max1 = max1 > sum ? max1 : sum;
    }
    return max1;
}
```

`getmax` 函数计算矩阵中的最大列和。它遍历每一列,计算列和,然后更新最大列和。

4. **深度优先搜索函数**

```c++
void dfs(int m[8][8], int row) {
    if (row == n) {
        return;
    }
    for (int i = 0; i < n; i++) {
        zy(m, row);
        int a = getmax(m);
        result = result < a ? result : a;
        dfs(m, row + 1);
    }
}
```

`dfs` 函数实现了深度优先搜索。它对当前行进行左移操作,然后计算最大列和,更新最小的最大列和,然后对下一行进行搜索。这个过程会对每一行进行所有可能的左移操作,并通过深度优先搜索找到所有可能的矩阵状态,从而找到最小的最大列和。

5. **主函数**

```c++
int main() {
    while (cin >> n) {
        if (n == -1) break;
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++) {
                cin >> m[i][j];
            }
        result = getmax(m);
        dfs(m, 0);
        cout << result << endl;
    }
    return 0;
}
```

`main` 函数首先读取输入数据,然后调用 `dfs` 函数进行搜索。最后输出找到的最小的最大列和。文章来源地址https://www.toymoban.com/news/detail-759268.html

到了这里,关于[递归] 平衡矩阵的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 线性代数3:矩阵

    目录 矩阵研究的是什么呢? 逆阵 什么叫做逆阵?  例题1:  例题2:  逆阵的存在性 定理1: 定理2: 定理3: 定理4: 拉普拉茨方程 方阵可以的条件  例题3:  Note1: 例题4  Note2:  Note3: Note4:  Note5:  Note6: Note7:  例题5:  逆矩阵的求法: 方法1:伴随矩阵法:  方

    2024年02月13日
    浏览(43)
  • 线性代数(七) 矩阵分析

    从性线变换我们得出,矩阵和函数是密不可分的。如何用函数的思维来分析矩阵。 通过这个定义我们就定义了矩阵序列的 收敛性 。 研究矩阵序列收敛性的常用方法,是用《常见向量范数和矩阵范数》来研究矩阵序列的极限。 长度是范数的一个特例。事实上,Frobenius范数对

    2024年02月08日
    浏览(40)
  • 线性代数-矩阵的本质

    线性代数-矩阵的本质

    2024年02月11日
    浏览(36)
  • 投影矩阵推导【线性代数】

    如果两个向量垂直,那么满足。但如果两个向量不垂直,我们就将 b 投影到 a 上,就得到了二者的距离,我们也称为向量 b 到直线 a 的误差。这样就有出现了垂直:                (1) 投影向量 p 在直线上,不妨假设  ,那么误差 。带入式(1)中得到: 投影矩阵:  

    2024年02月06日
    浏览(47)
  • 线性代数:矩阵的定义

    目录 一、定义 二、方阵 三、对角阵 四、单位阵 五、数量阵  六、行(列)矩阵  七、同型矩阵 八、矩阵相等 九、零矩阵 十、方阵的行列式

    2024年01月22日
    浏览(30)
  • 线性代数基础--矩阵

     矩阵是由排列在矩形阵列中的数字或其他数学对象组成的表格结构。它由行和列组成,并且在数学和应用领域中广泛使用。 元素:矩阵中的每个数字称为元素。元素可以是实数、复数或其他数学对象。 维度:矩阵的维度表示矩阵的行数和列数。一个 m × n 的矩阵有 m 行和

    2024年02月11日
    浏览(34)
  • 线性代数_对称矩阵

    对称矩阵是线性代数中一种非常重要的矩阵结构,它具有许多独特的性质和应用。下面是对称矩阵的详细描述: ### 定义 对称矩阵,即对称方阵,是指一个n阶方阵A,其转置矩阵等于其本身,即A^T = A。这意味着方阵A中的元素满足交换律,即对于任意的i和j(i ≤ j),都有A[

    2024年02月02日
    浏览(34)
  • 线性代数:矩阵的秩

    矩阵的秩(Rank)是线性代数中一个非常重要的概念,表示一个矩阵的行向量或列向量的线性无关的数量,通常用 r ( A ) r(boldsymbol{A}) r ( A ) 表示。具体来说: 对于一个 m × n mtimes n m × n 的实矩阵 A boldsymbol{A} A ,它的行秩 r ( A ) r(boldsymbol{A}) r ( A ) 定义为 A boldsymbol{A} A 的各

    2024年02月07日
    浏览(32)
  • 线性代数基础【2】矩阵

    一、基本概念 ①矩阵 像如下图示的为矩阵,记为A=(aij)m*n ②同型矩阵及矩阵相等 若A、B为如下两个矩阵 如果A和B的行数和列数相等,那么A和B为同型矩阵,且A和B的元素相等(即:aij=bij),则称A和B相等 ③伴随矩阵 设A为n阶矩阵(如上图所示),设A的行列式|A|,则A中aij的余子式为Mij,代数余

    2024年02月04日
    浏览(40)
  • 线性代数2:矩阵(1)

    目录 矩阵: 矩阵的定义: 0矩阵 方阵  同型矩阵: 矩阵相等的判定条件  矩阵的三则运算: 乘法的适用条件 矩阵与常数的乘法: 矩阵的乘法: 矩阵的乘法法则:  Note1:  Note2:  Note3:  向量与矩阵的关系: 转置矩阵:  矩阵多项式: 矩阵的重要性质:  性质2:  性质

    2024年02月08日
    浏览(73)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包