回溯法Matrix

该问题要求通过在给定的n*n矩阵中任意循环移动行,找到使所有列之和最大值达到最小的方法。题目给出每行可以进行SHIFT操作,即将整行向右移动一位,最右侧的元素移动到最左侧。程序使用回溯法进行暴力搜索,遍历所有可能的移动组合,计算并更新最小的最大列和。示例输入和输出展示了具体的操作过程。
摘要由CSDN通过智能技术生成

 

Matrix

Description

Given an n*nmatrix A, whose entries Ai,j are integer numbers ( 0 <= i < n, 0 <= j< n ). An operation SHIFT at row i ( 0 <= i < n ) will move theintegers in the row one position right, and the rightmost integer will wraparound to the leftmost column. 


You can do the SHIFT operation at arbitrary row, and as many times as you like.Your task is to minimize 

max0<=j<n{Cj|Cj=Σ0<=i< nAi,j}

Input

The input consistsof several test cases. The first line of each test case contains an integer n.Each of the following n lines contains n integers, indicating the matrix A. Theinput is terminated by a single line with an integer −1. You may assume that 1<= n <= 7 and |Ai,j| < 104.

Output

For each testcase, print a line containing the minimum value of the maximum of column sums.

Sample Input

2

4 6

3 7

3

1 2 3

4 5 6

7 8 9

-1

Sample Output

11

15

 

 

题意描述:给定一个N*N的矩阵,其中每一行可以任意循环移动。现在求使其移动后所有列之和最大值的最小值。

解题思路:没什么好方法,直接采用暴力搜索

程序为:

#include<iostream>

using namespace std;

int n;

int key[7][7];

int mine;

 

void shift(int row);

int sumcol(int col);

void copute(int row);

int main()

{

    cin>>n;

    while(n!=-1)

    {

        mine=100000;

        for(int i=0;i<n;i++)

        {

            for(int j=0;j<n;j++)

            {

                cin>>key[i][j];

            }

        }

        copute(0);

        cout<<mine<<endl;

        cin>>n;

    }

    return 0;

}

void shift(int row)

{

    inttem=key[row][n-1];

    for(int i=n-1;i>0;i--)

    {

        key[row][i]=key[row][i-1];

    }

    key[row][0]=tem;

}

int sumcol(int col)

{

    int sum=0;

    for(int i=0;i<n;i++)

        sum+=key[i][col];

    return sum;

}

void copute(int row)

{

    if(row==n)

    {

        return ;

    }

    intmax=-100000000;

    int sum;

    for(int i=0;i<n;i++)

    {

        sum=sumcol(i);

        if(sum>max)

            max=sum;

    }

    if(max<mine)

        mine=max;

    for(int i=0;i<n;i++)

    {

        shift(row);

        copute(row+1);

    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值