1. 程式人生 > >1490 ACM 數學

1490 ACM 數學

amp 分享 對角線 如果 space names b+ namespace 否則

題目:http://acm.hdu.edu.cn/showproblem.php?pid=1490

題意:

給出n*n 的矩陣,選出不同行不同列的n個元素,並求和;

如果所有選法所產生的和相等,則輸出 homogeneous 否則輸出not homogeneous 。

解析:通過自己在圖紙上畫,可以知道,實際上n*n的矩陣,符合題意的只有n!種選法。

數學規律:

要使n*n時homogeneous,必須該矩陣中的每一個2*2矩陣都是homogeneous。

證明:顯然,我們能發現在n!種方法中,每一種放法都可以由另一種放法 通過對角線移動而得(及交換兩坐標的X Y的值),所以移動前後的值必須相等。必須要該矩陣中的每一個2*2矩陣都是homogeneous。

技術分享圖片

及必須A1+A2==A3+A4

假設空處為a,b

技術分享圖片

那麽如果該矩陣中的每一個2*2矩陣都是homogeneous

及有:

  • A1+b==a+A4
  • a+A2==b+A3

兩式相加得:

A1+A2==A3+A4

如果

  • A1+b==a+A4
  • a+A2==b+A3

中有一個不成立,就不對

啟發:

像這樣的任意和全局型的問題,思考時可以從縮小規模的特殊情況開始考慮,如先令n=2,開始思考,從小到大;

code:

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

int n;
int a[1001][1001
]; int t; int main() { int i,j; while(cin>>n&&n) { t=1; for(i=1;i<=n;++i) for(j=1;j<=n;++j) cin>>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; break; } if(t) cout<<"homogeneous"<<endl; else cout<<"not homogeneous"<<endl; } return 0; }

1490 ACM 數學