SRM 489 DIV1 Easy - BallsConverter (復習○)

問題


http://community.topcoder.com/stat?c=problem_statement&pm=11211&rd=14242

2つのボールを捨てて、新しくボールを作るマシーンがある。2つのボールのタイプがi、jとすると、
新しく作られるボールはパターンc[i][j]もしくはc[j][i]となる。

このとき、最初に入っているボールがわかっているときに結果が変わらないパターンであればGood、そうでなければBadを返す。

解き方


問題文を理解するのが難しかった。
要は、任意の3つのボールに対して結合法則が成り立つかどうかを全てのタイプに対して調べればよい。

コード


#define all(c) (c).begin(),(c).end()
#define FORE(i,d,e) for(int i=d;i<e;i++)
#define FOR(i,s,e) for (int i = int(s); i != int(e); i++)
#define FORIT(i,c) for (typeof((c).begin()) i = (c).begin(); i != (c).end(); i++)
#define ISEQ(c) (c).begin(), (c).end()

class BallsConverter {

public:

int f(char ch){
if('A'<=ch&&ch<='Z')return ch-'A';
else return ch-'a'+26;
}

string theGood(vector<string> c) {
int n=c.size();
FORE(i,0,n)FORE(j,0,n)FORE(k,0,n)if(c[f(c[i][j])][k]!=c[i][f(c[j][k])])return "Bad";
return "Good";
}

};
このエントリーをはてなブックマークに追加