問題概要
文字の行列が与えられる。この行列が、対角要素が全て同じ文字であり、それ以外の要素が対角要素とは違う文字であるような行列かどうかを判定せよ。
解法
該当する分類の代表元(たとえば ( 0, 0 ) 要素と ( 0, 1 ) 要素)と一致しないものがあるか、代表元同士が等しければ "No" になります。対角要素か否かの振り分けは、( i, j ) 成分は i = j または n - 1 - i = j を満たすときに限り対角要素であるといことを利用します。
コード
typedef vector<string> VS; #define REP( i, m, n ) for ( int i = (int)( m ); i < (int)( n ); ++i ) #define FOR( v, c ) for ( auto &v : c ) int main() { cin.tie( 0 ); ios::sync_with_stdio( false ); int n; cin >> n; VS board( n ); FOR( line, board ) { cin >> line; } const char c1 = board[0][0], c2 = board[0][1]; set<char> cs; REP( i, 0, n ) { REP( j, 0, n ) { if ( c1 == c2 || ( i == j || n - 1 - i == j ? c1 : c2 ) != board[i][j] ) { cout << "NO" << endl; return 0; } } } cout << "YES" << endl; return 0; }