[递归] 平衡矩阵

平衡矩阵

题目描述

现在有一个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` 函数进行搜索。最后输出找到的最小的最大列和。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/193625.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LinuxBasicsForHackers笔记 --文本处理

查看文件 head <file name> – 如果只想查看文件的开头部分&#xff0c;可以使用 head 命令。默认情况下&#xff0c;此命令显示文件的前10行。如果您想查看多于或少于默认的 10 行的内容&#xff0c;请在 head 命令之后、文件名之前使用破折号 (-) 开关输入所需的数量。…

springboot centos集成 OpenOffice 实现 在线预览 doc excel docx 成pdf的 并且包含中文包和英文包和安装

我的资源里面有 springboot linux 集成 OpenOffice 实现在线预览 docx doc excel img等功能&#xff0c; 报问题 &#xff1a;no suitable windowing system found, exiting. 解决方案 yum groupinstall "X Window System"如果还是报这个错 执行 yum groupinstall …

Google Guava 数学工具使用详解

文章目录 数学数值运算取整范围值比较其他 数学 在 Guava 中&#xff0c;数学&#xff08;Math&#xff09;模块提供了一些常用的数学运算功能&#xff0c;包括数值运算、取整、范围值比较等。下面详细介绍一些 Guava 数学运算的使用方法和示例。 数值运算 IntMath 类提供了处…

App测试之App日志收集及adb常用命令

文章目录 前言一、adb是什么1.APP测试收集手机日志常用的工具2.adb下载与安装3.ADT/SDK/ADB是什么4.adb连接真机 二、adb常用命令三、android系统日志文件1.logcat日志文件2.logcat日志文件分析 四、分析crash & ANR 日志1.发生crash如何分析2.发生ANR如何分析 总结扩展&am…

前端组件库开发

通常我们会使用很多组件库&#xff0c;有时候我们会去看源码比如element&#xff0c;antd&#xff0c;然后发现多少是按需导出&#xff0c;和vue.use全局注册&#xff0c;依赖于框架的拓展。 组件库的开发依赖框架的版本和node的版本&#xff0c;这个是需要说明的&#xff0c;然…

【阅读论文】时间序列异常检测:综合评价

文章目录 摘要1 异常检测范围2 时间序列和异常3 异常检测技术3.1预测方法3.2重建方法3.3编码方法3.4距离方法3.5分布方法3.6隔离树方法 4 实验评估4.1环境和设置4.2结果质量4.3运行时和内存 5 讨论致谢参考文献 摘要 在金融应用中&#xff0c;检测时间序列数据中的异常子序列是…

解决浏览器缓存问题

1.index.html文件meta标签添加属性 <meta name"viewport" content"widthdevice-width,initial-scale1.0, maximum-scale1.0, minimum-scale1.0, user-scalableno" viewport-fitcover >2.提前main.html处理逻辑再跳转到index.html页 <script>…

ubuntu下QT搭建Android开发环境

一、前言 用QT开发android和直接使用android开发的区别 使用Qt开发Android应用和直接使用Android开发工具&#xff08;例如Android Studio&#xff09;有一些区别&#xff0c;主要体现在开发工具、语言、界面设计和性能等方面&#xff1a; 开发工具&#xff1a; Qt Creat…

Python----字典练习

相关链接&#xff1a;Python---字典的增、删、改、查操作_python中字典的增删改查-CSDN博客 Python---字典---dict-CSDN博客 Python---引用变量与可变、非可变类型-CSDN博客 重点&#xff1a; 字典中的 key &#xff08;就是键&#xff09;可以是很多数据类型&#xff08;…

jmeter下载地址

Jmeter安装教程【5.5】【Windows】jmeter详细安装配置教程&#xff0c;装不好你打我_一只莽夫的博客-CSDN博客

Java线程池的使用和最佳实践

第1章&#xff1a;引言 处理并发问题时&#xff0c;如果每次都新建线程&#xff0c;那系统的压力得有多大&#xff1f;这时候&#xff0c;线程池就像一个英雄一样出现了&#xff0c;它帮我们有效地管理线程&#xff0c;提高资源利用率&#xff0c;降低开销。那么&#xff0c;为…

代理模式介绍(静态代理、jdk动态代理、cglib代理)

一、静态代理 &#xff08;一&#xff09;定义 1、定义 为其他对象提供一种代理以控制对这个对象的访问&#xff1b; 2、涉及到的角色 &#xff08;1&#xff09;抽象主题角色&#xff1a;真实主题和代理主题的共同接口&#xff0c;便于在使用真实主题的地方都可以使用代理…

C#网络编程System.Net.WebClient 类vs System.Net.Http.HttpClient 类

目录 一、WebClient 类 1.WebClient 将数据上传到资源的方法 2.WebClient 从资源下载数据的方法 3.示例源码 4.生成效果 二、HttpClient 类 1.示例源码 2.生成效果 为什么要把两者拿出来pk呢&#xff1f;那是因为WebClient已经在.NET 6.0以后得版本被弃用了&#xff0c…

python跑ncnn(验证模型是否转换成功)

为了转ncnn模型是否成功&#xff0c;用python验证一下先 pip install ncnn分割模型的验证代码 import ncnn import cv2 import numpy as np# 创建ncnn的网络对象 net ncnn.Net()# 加载ONNX模型 net.load_param(E:\\Android_Projects\\ncnn-android-deeplabv3plus-main\\app\…

Spring学习笔记:Day1

学习策略&#xff1a; 理论与实践相结合&#xff1a;每学完一个知识点&#xff0c;尝试进行小的练习或小的项目实践。 持续反馈&#xff1a;在学习过程中&#xff0c;参与社区、论坛或与同事进行讨论&#xff0c;及时解决遇到的问题。 实际项目驱动&#xff1a;在学习后期&a…

PHP字符串面试题

PHP字符串面试题 1. 创建一个字符串变量&#xff0c;并打印输出字符串的内容。 <?php $string "Hello, World!"; echo $string; ?>2. 如何获取字符串的长度&#xff1f; <?php $string "Hello, World!"; $length strlen($string); echo …

P1530 [USACO2.4] 分数化小数 Fractions to Decimals

题目描述 写一个程序,输入一个形如 DN​ 的分数,输出它的小数形式。如果小数有循环节的话,把循环节放在一对圆括号中。 例如,13=0.33333333…31​=0.33333333… 写成 0.(3)0.(3),41333=0.123123123…33341​=0.123123123… 写成 0.(123)0.(123),整数 x 写成 x.0。 输入…

Vue3父子组件通信

一、父组件给子组件传值 子组件 ShipHomePortDialog 1.定义变量名称 <script lang"ts" setup> const props defineProps([title]) </script> 2.在template中使用变量 <h4>{{ title }}</h4> 3.在Script代码使用 var t props.title…

鸿蒙开发笔记

最近比较火&#xff0c;本身也是做前端的&#xff0c;就抽空学习了下。对前端很友好 原视频地址&#xff1a;黑马b站鸿蒙OS视频 下载安装跟着视频或者文档就可以了。如果你电脑上安装的有node&#xff0c;但是开发工具显示你没安装&#xff0c;不用动咱们的node&#xff0c;直…

15个Pandas代码片段助力数据分析

大家好&#xff0c;Python的Pandas库是数据分析的基本工具&#xff0c;提供了强大的数据操作和分析功能。本文将探讨15个高级Pandas代码片段&#xff0c;这些代码片段将帮助简化数据分析任务&#xff0c;并从数据集中提取有价值的见解。 1. 过滤数据 import pandas as pd# 创…