第23回オフラインリアルタイムどう書く「くねくね増加列」の C言語による実装


問題 http://nabetani.sakura.ne.jp/hena/ord23snakemoinc/
解答リンク集 http://qiita.com/Nabetani/items/7ba11167ea28c929fcf2
イベント http://yhpg.doorkeeper.jp/events/12339

たまには C 言語でも書かなきゃね。
と思い、書いてみた。

// CC_OPTS="clang -std=c99 -Wall"
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

enum{ MAP_W = 5 };
enum{ MAP_H = 5 };
enum{ MAPSIZE = MAP_H * MAP_W };

int cell_value( char const * src, int x, int y )
{
  if ( 0<=x && x<MAP_W && 0<=y && y<MAP_H ){
    return src[ x+y*(MAP_W+1) ]; // +1 は、デリミタの "/"。
  } else {
    return INT_MAX;
  }
}

int max_2( int a, int b ){  return a<b ? b : a;  }
int max_4( int a, int b, int c, int d )
{
  return max_2( max_2( a, b ), max_2( c, d ) );
}

struct kune{
  char const * src;
  int distmap[ MAPSIZE ];
};

int nei_dist( struct kune const * kune, int x, int y, int digit )
{
  int v = cell_value( kune->src, x, y );
  return v<digit ? kune->distmap[ x+y*MAP_W ] : 0;
}

int neibour_max_dist( struct kune const * kune, int x, int y )
{
  int digit = cell_value( kune->src, x, y );
  return max_4(
    nei_dist( kune, x-1, y, digit ),
    nei_dist( kune, x+1, y, digit ),
    nei_dist( kune, x, y-1, digit ),
    nei_dist( kune, x, y+1, digit ) );
}

int solve( char const * src )
{
  struct kune kune = { src };
  int r=0;
  for( char digit='0' ; digit<='9' ; ++digit ){
    for( int y=0 ; y<MAP_H ; ++y ){
      for( int x=0 ; x<MAP_W ; ++x ){
        if ( cell_value( src, x, y ) == digit ){
          int nei=neibour_max_dist( &kune, x, y );
          kune.distmap[ x+y*MAP_W ] = nei+1;
          r=max_2( nei+1, r );
        }
      }
    }
  }
  return r;
}

void test( char const * src, char const * expected )
{
  int e = atoi( expected );
  int a = solve( src );
  printf( "%s %s -> %2d ( %2d )\n", (a==e ? "ok" : "**NG**" ), src, a, e );
}

int main()
{
/*0*/ test( "01224/82925/69076/32298/21065", "6" );  
/*50*/ test( "02489/77571/84873/03879/84460", "7" );
return 0;
}

いつも通り、テストデータの大半は省略。

ruby で書いた
http://qiita.com/Nabetani/items/abce08a153b2fbfa6e36#2-1
をそのまま移植した。

いやしかし。
何度書いても Cで書くと長くなってびっくりする。