poj2941

题意:给一个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;
}
posted @ 2011-09-14 10:54  金海峰  阅读(220)  评论(0编辑  收藏  举报