朝日新聞2006年2月24日パズル横丁解答

プログラムの実行結果は以下の通り。

A:x:1, y:1, z:3
B:x:1, y:4, z:1
全部で 14 段

これを図示すると以下の通り。

プログラムのソースは以下の通り。

#include "puzutl.h"

int main( int argc, cstring argv[])
{
  char          tmp[128];
  map<int,string>   A, B;
  map<int,string>::iterator f;
  for( int x=1; x< 10; x++) {
    for( int y=1; y< 10; y++) {
      for( int z=1; z< 10; z++) {
        int step = 3*x + 2*y + 3*z;
        if( (x+y+z)&1) {        // 合計歩数が奇数
          if( (f=A.find(step)) != A.end()) {
            ps( "A:x:%d, y:%d, z:%d\n", x, y, z);
            ps( "B:%s\n", (*f).second.c_str());
            ps( "全部で %d 段\n", step);
            exit(0);
          }
          sprintf( tmp, "x:%d, y:%d, z:%d", x, y, z);
          B.insert( pair<int,string>(step,tmp));
        }
        else {
          if( (f=B.find(step)) != B.end()) {
            ps( "A:%s\n", (*f).second.c_str());
            ps( "B:x:%d, y:%d, z:%d\n", x, y, z);
            ps( "全部で %d 段\n", step);
            exit(0);
          }
          sprintf( tmp, "x:%d, y:%d, z:%d", x, y, z);
          A.insert( pair<int,string>(step,tmp));
        }
      }
    }
  }
  return    0;
}