回溯法Matrix

来源:互联网 发布:iphone蜂窝数据快捷键 编辑:程序博客网 时间:2024/06/15 09:28

 

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