题目大意:
给出n*n 的矩阵,选出不同行不同列的n个元素,并求和;
如果所有选法所产生的和相等,则输出 homogeneous
否则输出not homogeneous
正常来说题有n!中情况,如果全部计算出来会tle
这里其实只需要哦O(n*n)的复杂度就可以算出~
我们并不一定要算出所有的情况~
先来(1,1)(2,2)(3,3)(4,4)和(1,2)(2,1)(3,3)(4,4)这两种情况~
第二种情况是由上一种改变了一次所变化而来~
即把(1,1)(1,2)(2,1)(2,2)这四个点组成的小正方形对角线相互交换~
所以只要每次交换最小最小的正方形的对角线并判断即可~
① | ② | |
③ | ④ | |
⑤ | ⑥ |
那么来考虑这种情况
x | ||
x | ||
x |
x表示选择了这些个点进行加和~
x | ||
x | ||
x |
那么假设两两小正方形的对角线和相等~
则 ①+④=②+③
③+⑥=④+⑤
两式相加得①+⑥+④+③=②+⑤+④+③
两边消去得①+⑥=②+⑤
所以上述消去证明了只要每个小正方形的对角线和相等~就能证明结论成立
#include"stdio.h"
int n;
int a[1001][1001];
int t;
int main()
{
int i,j;
while(~scanf("%d",&n)&&n)
{
t=1;
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
scanf("%d",&a[i][j]);
for(i=1;t&&i<n;i++)
for(j=1;t&&j<n;j++)
if(a[i][j]+a[i+1][j+1]!=a[i][j+1]+a[i+1][j])
t=0;
if(t)
puts("homogeneous");
else
puts("not homogeneous");
}
return 0;
}