TopCoder SRM 360 Div1 Easy SumOfSelectedCells

問題

行列が与えられる。
行列から、条件を満たすように成分を選ぶ。

  • 同じ行から二つ以上の成分を選ばない
  • 同じ列から二つ以上の成分を選ばない
  • 上の条件を満たす選び方で、選ぶ個数が最も多くなるように選ぶ

このとき、どのような成分の選び方をしても、成分の和が同じならばCORRECTを、そうでないならINCORRECTを出力せよ。

制約条件

行≦20
列≦20

方針

行列が正方行列でない場合、
縦か横に長い場合、
長いほうの成分は全部同じ数でなくてはならない。
AAAAA
BBBBB
CCCCC
みたいに。


行列が正方行列だったら、
任意の二つの要素を(i,j)(k,l)とすると、
行と列を入れ替えて、(i,l)(k,j)のように成分を選んだとき和が異なっていたらINCORRECT
全ての要素について和が一致したらCORRECT.

ソースコード

class SumOfSelectedCells {
  public:
  string hypothesis(vector <string> table) {
    vector<vi> t;
    int h=table.size(),w;
    rep(i,h){
      stringstream ss(table[i]);
      int a;
      vi v;
      while(ss>>a)v.pb(a);
      t.pb(v);
    }
    w=t[0].size();
    if(h==w){
      rep(i,h)rep(j,w)rep(k,h)rep(l,w)if(t[i][j]+t[k][l]!=t[i][l]+t[k][j])
        return "INCORRECT";
    }
    else if(h>w){
      rep(i,w)rep(j,h)rep(k,h)if(t[j][i]!=t[k][i])return "INCORRECT";
    }
    else{
      rep(i,h)rep(j,w)rep(k,w)if(t[i][j]!=t[i][k])return "INCORRECT";
    }
    return "CORRECT";
  }
};