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.
![](http://acm.zju.edu.cn/onlinejudge/showImage.do?name=0000%2F2418%2Fa.gif)
You can do the SHIFT operation at arbitrary row, and as many times as you like. Your task is to minimize
![](http://acm.zju.edu.cn/onlinejudge/showImage.do?name=0000%2F2418%2Fa2.gif)
Input
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.
Output
For each test case, 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
Source: Asia 2004, Shanghai (Mainland China), Preliminary
题意:给你一个矩阵,每个矩阵的每一行可以依次往右移动一个位置,最右边移出来的可以补到最左边,也就是循环移动啦,移动次数不限。问你移动后每列元素的和的最大值最小是多少。
解题思路:暴力枚举每行移了几次,第一行可以假设它不动
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <set>
#include <stack>
#include <map>
#include <functional>
#include <bitset>
#include <string>
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f
int a[10][10];
int ans[10];
int n,mi;
void dfs(int x)
{
if(x==n)
{
int ma=-1;
for(int i=0; i<n; i++)
{
int ans1=0;
for(int j=0; j<n; j++)
{
int pos=ans[j]+i;
if(pos>=n) pos-=n;
ans1+=a[j][pos];
}
ma=max(ans1,ma);
}
mi=min(mi,ma);
return;
}
for(int i=0; i<n; i++)
{
ans[x]=i;
dfs(x+1);
}
}
int main()
{
while(~scanf("%d",&n)&&n!=-1)
{
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
scanf("%d",&a[i][j]);
mi=INF;
ans[0]=0;
dfs(1);
printf("%d\n",mi);
}
return 0;
}