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);
}
}