[递归] 平衡矩阵

平衡矩阵

题目描述

现在有一个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.mfbz.cn/a/213496.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot框架结合Redis实现分布式锁

一、SpringBoot结合 Redis实现分布式锁 1.1、什么是分布式锁 分布式锁&#xff0c;是在分布式的环境下&#xff0c;才会使用到的一种同步访问机制&#xff0c;在传统的单体环境里面&#xff0c;不存在分布式锁的概念&#xff0c;只有在分布式环境里面&#xff0c;才有分布式锁…

【Python】tensorflow学习的个人纪录(3)

sess tf.Session()actor Actor(sess, n_featuresN_S, lrLR_A, action_bound[-A_BOUND, A_BOUND])步进&#xff1a;

工具网站:随机生成图片的网站

一个随机生成图片的网站&#xff1a;Lorem Picsum。 有时候&#xff0c;我们做静态页面需要大量图片去填充内容&#xff0c;以使用该网站去生成指定尺寸的图片。每次打开页面都会获取不同的图片&#xff0c;就不用我们做静态页面开发的时候&#xff0c;绞尽脑汁去找图片了。 …

【滑动窗口】水果成篮

水果成篮 904. 水果成篮 - 力扣&#xff08;LeetCode&#xff09; 文章目录 水果成篮题目描述问题转化 算法原理解法一解法二 代码编写C代码&#xff1a;使用容器数组模拟哈希表 Java代码使用容器数组模拟哈希表 题目描述 你正在探访一家农场&#xff0c;农场从左到右种植了一…

【hacker送书活动第7期】Python网络爬虫入门到实战

第7期图书推荐 内容简介作者简介大咖推荐图书目录概述参与方式 内容简介 本书介绍了Python3网络爬虫的常见技术。首先介绍了网页的基础知识&#xff0c;然后介绍了urllib、Requests请求库以及XPath、Beautiful Soup等解析库&#xff0c;接着介绍了selenium对动态网站的爬取和S…

红队攻防实战之Access注入

若盛世将倾&#xff0c;深渊在侧&#xff0c;我辈当万死以赴 访问漏洞url: 1.Access联合查询 判断是否有注入 and 11正常&#xff0c;and 12出错 判断字段数 order by 7正常 order by 8出错 爆破出表名并判断回显点为2&#xff0c;5 查看字段内容&#xff0c;将字段名填入回…

37. 解数独

题目描述 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&#xff08;请参考示例图&#xff09; …

思维模型 反馈效应

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。反馈促进改进。 1 反馈效应的应用 1.1 反馈效应在营销中的应用 1 “可口可乐与百事可乐之战” 在 20 世纪 80 年代&#xff0c;可口可乐公司是全球最大的饮料公司之一&#xff0c;其市场…

常见的线程安全问题及解决

1. 什么是线程安全 线程安全指的是当多个线程同时访问一个共享的资源时&#xff0c;不会出现不确定的结果。这意味着无论并发线程的调度顺序如何&#xff0c;程序都能够按照设计的预期来运行&#xff0c;而不会产生竞态条件&#xff08;race condition&#xff09;或其他并发问…

算法设计与实现--贪心篇

贪心算法 贪心算法是一种在每一步选择中都采取当前状态下最优决策的算法&#xff0c;以期望能够通过一系列局部最优的选择达到全局最优。贪心算法的关键是定义好局部最优的选择&#xff0c;并且不回退&#xff0c;即一旦做出了选择&#xff0c;就不能撤销。 一般来说&#xf…

洛谷 P5711 闰年判断 C++代码

目录 前言 思路点拨 AC代码 结尾 前言 今天我们来做洛谷上的一道题目。 网址&#xff1a;【深基3.例3】闰年判断 - 洛谷 题目&#xff1a; 思路点拨 首先题目让我们输入一个年份&#xff0c;因此我们需要定义一个变量year&#xff0c;来存储输入的年份&#xff1a; in…

Bean的加载控制

Bean的加载控制 文章目录 Bean的加载控制编程式注解式ConditionalOn*** 编程式 public class MyImportSelector implements ImportSelector {Overridepublic String[] selectImports(AnnotationMetadata annotationMetadata) {try {Class<?> clazz Class.forName("…

Nginx 具体应用

1 Nginx 1.1 介绍 一款轻量级的 Web 服务器/反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器。它占有的内存少&#xff0c;并发能力强&#xff0c;中国大陆使用 nginx 的网站有&#xff1a;百度、京东、新浪、网易、腾讯、淘宝等。第一个公开版本发布于…

Flyway 数据库版本管理 | 专业解决方案

前言 目前很多公司都是通过人工去维护、同步数据库脚本&#xff0c;但经常会遇到疏忽而遗漏的情况&#xff0c;同时也是非常费力耗时 比如说我们在开发环境对某个表新增了一个字段&#xff0c;而提交测试时却忘了提交该 SQL 脚本&#xff0c;导致出现 bug 而测试中断&#xf…

vs 安装 qt qt扩展 改迅雷下载qt

Qt5.14.2安装教程和VS2019中的qt环境配置-CSDN博客 1 安装qt 社区版 免费 Download Qt OSS: Get Qt Online Installer 2 vs安装 qt vs tools 3 vs添加 qt添加 bin/cmake.exe 路径 3.1 扩展 -> qt versions 3.2 4 新版要源码安装 需要自己安装 安装独立安装的旧版 官网…

go自定义端口监听停用-------解决端口被占用的问题

代码 package mainimport ("fmt""log""net""os/exec""strconv""strings" )func getSelect(beign int, end int) int {var num intfor {_, err : fmt.Scan(&num)if err ! nil {fmt.Println("输入错误&am…

【c】角谷猜想

#include<stdio.h> int coll(int x)//定义函数 {int count0;while(x>1){if(x%20){xx/2;count;}else{x3*x1;count;}}return count; } int main() {int n,num;scanf("%d",&n);int arr[n1];for(int i1;i<n;i)//输入n组数据保存到数组中{scanf("%d&…

Python图表神器:Matplotlib库绘制图表轻松有趣

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com Matplotlib是Python中用于绘制图表和数据可视化的重要库。它提供了丰富的功能和灵活性&#xff0c;可用于生成各种类型的图表&#xff0c;从简单的折线图到复杂的三维图表。 1. 基本图表绘制 折线图 Matplotl…

【【Micro Blaze 的 最后补充 与 回顾 】】

Micro Blaze 的 最后补充 与 回顾 Micro Blaze 最小系统 以 MicroBlaze 为核心、LocalMemory&#xff08;片上存储&#xff09;为内存&#xff0c;加上传输信息使用的 UART串口就构成了嵌入式最小系统。当程序比较简单时&#xff0c;Local Memory 可以作为程序的运行空间以及…

如何调用 API | 学习笔记

开发者学堂课程【阿里云 API 网关使用教程:如何调用 API】学习笔记&#xff0c;与课程紧密联系&#xff0c;让用户快速学习知识。 课程地址&#xff1a;阿里云登录 - 欢迎登录阿里云&#xff0c;安全稳定的云计算服务平台 如何调用 API 调用 API 的三要素 要调用 API 需要三…