Given an n*n matrix 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 the integers in the row one position right, and the rightmost integer will wrap around to the leftmost column.
Ai,0 -> Ai,1 -> Ai,2 -> Ai,3 -> ... -> Ai,n-2 -> Ai,n-1 -> Ai,0
You can do the SHIFT operation at arbitrary row, and as many times as you like. Your task is to minimize
max{ Cj | Cj= Σ0<=i< nAi,j , 0<= j < n}
输入格式
The input consists of 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. The input is terminated by a single line with an integer −1. You may assume that 1 <= n <= 7 and |Ai,j| < 104.
输出格式
For each test case, print a line containing the minimum value of the maximum of column sums.
样例输入
2 4 6 3 7 3 1 2 3 4 5 6 7 8 9 -1
样例输出
11 15
#include <stdio.h>
int n;
int a[8][8];
int ans;
void rota(int i){
int temp;
temp=a[i][n-1];
int j;
for(j=n-2;j>=0;j--)
a[i][j+1]=a[i][j];
a[i][0]=temp;
}
void solve(int i){
if(i==n){
int sum,max,j;
max=-800;
for(i=0;i<n;i++){
sum=0;
for(j=0;j<n;j++)
sum+=a[j][i];
if(sum>max)
max=sum;
}
if(max<ans){
ans=max;
return;
}
}
else{
int k;
for(k=0;k<n;k++){
rota(i);
solve(i+1);
}
}
}
int main(){
int i,j;
while(scanf("%d",&n)==1&&n!=-1){
for (i=0;i<n;i++)
for (j=0;j<n;j++)
scanf("%d",&a[i][j]);
ans=800;
solve(0);
printf("%d\n",ans);
}
return 0;
}