题目描述
给一个n*n的矩阵A,它的每一个元素Ai,j都是整数( 0 <= i < n, 0 <= j < n )。在每一行i( 0 <= i < n )给一个右移操作,使第i行的整数整体向右移动一个位置,最右边的整数将会移动到最左端的那一列。
你可以在任意行做右移操作,这样你会得到一个新的矩阵,对于新的矩阵你当然也可以做右移操作。你的任务就是求列最小值ColMin,它是所有得到矩阵的列最大值中的最小值。
max(0 <= j < n){Cj|Cj=Σ0<=i < nAi,j}
输入
可能包含多次输入。第一行是一个整数n,接下来n行每行包含n个整数,这些数据就是n*n的矩阵A的元素。如果输入仅含有-1的一行,就表示输入终止。其中1 <= n <= 7 而且 |Ai,j| < 104 。
输出
对于每组测试,打印一行包含一个数值,它在一个矩阵中是列最大值,但是在所有的变换矩阵中又是列最小值。
样例输入
2
4 6
3 7
3
1 2 3
4 5 6
7 8 9
-1
样例输出
11
15
#include <iostream>
using namespace std;
int ans = 0x7fffffff;
void Move(int row, int n, int a[10][10]) {
int temp = a[row][n-1];
for (int i = n-1; i > 0; --i) {
a[row][i] = a[row][i-1];
}
a[row][0] = temp;
}
void dfs(int index, int n, int a[10][10]) {
if (index == n){
return;
}
int maxsum = -100000000;
for (int i = 0; i < n; ++i) {
int sum = 0;
for (int j = 0; j < n; ++j) {
sum += a[j][i];
}
maxsum = max(maxsum, sum);
}
ans = min(ans, maxsum);
for (int i = 0; i < n; ++i) {
Move(index, n, a);
dfs(index + 1, n, a);
}
}
int main()
{
int n, a[10][10];
while (cin >> n) {
if (n == -1)
break;
ans = 0x7fffffff;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
cin >> a[i][j];
}
}
dfs(0, n, a);
cout << ans << endl;
}
return 0;
}
这道题竟然是纯暴力解,我之前还去找逻辑规律了(虽然找到了,但是不会用啊!!)暴力大法好~

给定一个n*n的矩阵,每行执行一次右移操作,目标是找到所有可能矩阵的列最大值中的最小值。输入包含多次矩阵,每次输入后输出满足条件的列最小值。
492

被折叠的 条评论
为什么被折叠?



