POJ_2941_矩阵

题目描述:

  每组数据给定一个n*n的矩阵,选定不同行不同列的n个元素,求和,若所有选法所产生的和相等,则输出 homogeneous,否则输出not homogeneous。

 

描述:

  数据挺大,爆搜肯定超时,于是有下面的递推的规律。

 

当n为3时,有这么一个矩阵,数字表示编号。

1 2 3
4 5 6
7 8 9

 

 

 

我们只需要让它的每个2阶的子矩阵符合题目条件,则它必然符合条件。

1 2
4 5

   

 

2 3
5 6

 

 

4 5
7 8

 

 

5 6
8 9

 

 

然后就可以发现一个规律,对于任意一个n阶矩阵,只要它的所有n-1阶子矩阵是homogeneous的,则它便是homogeneous的,进一步可得,只要它所有的2阶子矩阵符合两对角线相乘相等即可。

 

这样,问题便解决了。最后,我提交程序的时候却是一直超时!一个O(n^2)的程序,不至于啊= =。然后修改了无数遍,最终发现了问题所在,iostream库中的cin和cout在与stdin同步的情况下,效率比scanf和printf相差很大,最大可达十几倍,可怕!改成scanf和printf之后再提交便AC了。可见,对于含有大量数据的题目,慎用cin和cout啊= =!

 

#include<iostream>
#include<cstdio>
using namespace std;

int a[1005][1005];

int main()
{
    int n;
    while(~scanf("%d",&n) && n)
    {
        int flag = 1;
        for(int i = 1;i <= n;i++)
        {
            for(int j = 1;j <= n;j++)   scanf("%d",&a[i][j]);
        }

        for(int i = 1;i < n;i++)
        {
            for(int j = 1;j < n;j++)
            {
                if(a[i][j]+a[i+1][j+1] != a[i][j+1]+a[i+1][j])
                {
                    flag = 0;
                    goto there;
                }
            }
        }
        there:
        if(flag)    printf("homogeneous\n");
        else        printf("not homogeneous\n");
    }
    return 0;
}

 

posted @ 2016-09-04 19:50  zzzzzzzzhu  阅读(487)  评论(0编辑  收藏  举报