题意:给一个n*n矩阵,问选n个格,每行一个每列一个,是否任意选法的加和都相等。
分析:我们认为我们只选择对角线上的n个格。这样任意两种选法可以通过行列交换来得到。如果要选(1,2)(2,1)可以交换1,2两列,然后仍然选择对角线。由于有些情况可能需要多次交换,这样就要求任意一次交换不能影响加和。所以矩阵中任意的矩形的四角都满足a+c=b+d。即a-b=c-d。即任意两列,所有对应位差相等。有一个简便的判别方法,任意两列对应位差相等<=>所有相邻列对应位差相等。
View Code
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
usingnamespace std;
#define maxn 1005
int n;
int map[maxn][maxn];
void input()
{
for (int i =0; i < n; i++)
for (int j =0; j < n; j++)
scanf("%d", &map[i][j]);
}
bool ok()
{
for (int i =1; i < n; i++)
{
int x = map[i][0] - map[i -1][0];
for (int j =0; j < n; j++)
if (map[i][j] - map[i -1][j] != x)
returnfalse;
}
returntrue;
}
int main()
{
//freopen("t.txt", "r", stdin);
while (scanf("%d", &n), n)
{
input();
if (ok())
printf("homogeneous\n");
else
printf("not homogeneous\n");
}
return0;
}