poj2941 Homogeneous Squares

题目大意:

给出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;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值