题目意思:
题目给出你一个矩阵,举证的每一行可以任意向右旋转任意多格,存在一个状态,使得所有列的和的最大值是最小,求这个最小值。
解题思路:
暴力枚举,虽然很耗时,呵呵,但是很简单就通过了
代码:
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;
}