http://poj.org/problem?id=2078
Matrix
Time Limit: 2000MS |
| Memory Limit: 30000K |
Total Submissions: 3022 |
| Accepted: 1561 |
Description
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.
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 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 |A
i,j| < 10
4.
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
给一个n*n的数组,数组元素都为整数,数组的每行可以循环右移,每次循环移动后,把每列的元素加起来所得的结果中找出一个最大的值,每次循环移动后都可以得到一个最大值,在这所有最大值中找出最小的结果输出。如有数组:
1 2 3
4 5 6
7 8 9
下面是该数组的求解过程:max:18 17 16 17 16 15 16 15 17
在所有得到的max中找出最小值:15。最后输出15。
解题思路:
本题意思是矩阵的每个行都可以向→移动 然后把所有相同列的元素相加取其中列和最大值,然后输出列最大值中的最小值,我直接用的n^n的暴力搜索,生成一颗n叉的树,然后把每次的值都求出来保存最小的值最后输出该最小值。。
嗨,在最小值这边纠结了还久啊啊啊呵。。。
#include <iostream>
#include <algorithm>
using namespace std;
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;
int max;
int j;
max=0x80000000;
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(cin>>n && n!=-1)
{
for (i=0;i<n;i++)
{
for (j=0;j<n;j++)
{
cin>>a[i][j];
}
}
ans=0x7fffffff;
solve(0);
cout<<ans<<endl;
}
return 0;
}