第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で書くと長くなってびっくりする。
Author And Source
この問題について(第23回オフラインリアルタイムどう書く「くねくね増加列」の C言語による実装), 我々は、より多くの情報をここで見つけました https://qiita.com/Nabetani/items/076244513b1c57c31b66著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .