概要
の行列が与えられる。
行列の各要素は 0 または 1 で、1 は一つだけである。
隣接する行または隣接する列を入れ替える操作が許されている。
行列の中央に 1 がある行列を「美しい行列」であるとして、与えられた行列を美しい行列にするためには最低何回の操作が必要か答えよ。
解法
行と列は独立に考えることができます。
従って、1 のあるインデックスについて、行・列それぞれ 3 ( 1-indexed ) との差を足せば答えが求まります。
コード
typedef vector<int> VI; typedef vector<VI> VVI; #define REP( i, m, n ) for ( int i = (int)( m ); i < (int)( n ); ++i ) #define EACH( v, c ) for ( auto &v : c ) int solve( VVI board ) { REP( i, 0, 5 ) { REP( j, 0, 5 ) { if ( board[i][j] == 1 ) { return abs( i - 2 ) + abs( j - 2 ); } } } return -1; } int main() { cin.tie( 0 ); ios::sync_with_stdio( false ); VVI board( 5 ); EACH( line, board ) { line = VI( 5 ); EACH( a, line ) { cin >> a; } } cout << solve( board ) << endl; return 0; }