题目意思: 题目给出你一个矩阵,举证的每一行可以任意向右旋转任意多格,存在一个状态,使得所有列的和的最大值是最小,求这个最小值。 解题思路: 暴力枚举,虽然很耗时,呵呵,但是很简单就通过了 代码: #include<cstdio> #define MAX 0x7FFFFFFF int m[7][7]; int MIN; void show(int n) { for(int i = 0; i < n; ++i) { for(int j = 0; j < n; ++j) { printf("%d ", m[i][j]); } printf("/n"); } } void move(int row, int n) { int temp = m[row][n - 1]; for(int i = n - 1; i >= 1; --i) { m[row][i] = m[row][i - 1]; } m[row][0] = temp; } int getmax(int n) { int max = -1, sum; for(int i = 0; i < n; ++i) { sum = 0; for(int j = 0; j < n; ++j) { sum += m[j][i]; } if(sum > max) max = sum; } return max; } int search(int t, int n) // 搜索 { if(t >= n) { int max = getmax(n); if(max < MIN) { MIN = max; } } else { move(t, n); search(t + 1,n); for(int i = 0; i < n - 1; ++i) { move(t, n); search(t + 1, n); } } } int main() { int n; while(scanf("%d", &n) && n != -1) { for(int i = 0; i < n; ++i) for(int j = 0; j < n; ++j) scanf("%d", &m[i][j]); MIN = MAX; search(0, n); printf("%d/n", MIN); } return 0; }