上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
 
makeplex salon:あなたのスキルで飯は食えるか? 史上最大のコーディングスキル判定
をやってみました。

言語:C
OS:Linux
開発環境:gcc

順子、刻子、頭で構成とあるので七対子は無視。
忘れたわけじゃ…ないんだからね!

所要時間
構想:15分
コーディング:1時間
デバッグ:1時間
コメント付加:5分
計:2時間20分

バグ無しで書いたとしても1時間以上、40分はきつい…

以下ソース


#include

typedef struct
{
int rest; // 残り牌数
int tiles[9]; // 牌リスト
int stair_list[9]; // 順子リスト
int kind_list[9]; // 刻子リスト
int head; // 頭
}TILE_ARCH;

// デバッグ用 牌リスト表示
void debug_print_tiles(TILE_ARCH* tile_arch)
{
int i;

for(i=0; i<9; i++)
{
printf("%d ", tile_arch->tiles[i]);
}
printf("\n");
}

// 牌構成データ作成
int make_tile_arch(TILE_ARCH* tile_arch, char* tiles)
{
int i;
int tile_no;

for(i=0; i<9; i++)
{
tile_arch->tiles[i] = 0;
tile_arch->stair_list[i] = 0;
tile_arch->kind_list[i] = 0;
}
tile_arch->head = -1;

for(i=0; i<13; i++)
{
tile_no = tiles[i] - '0';
if(tile_no < 1 || 9 < tile_no)
{
return 0;
}

tile_arch->tiles[tile_no-1]++;
}

tile_arch->rest = 13;

return 1;
}

// 牌構成表示
void print_tile_arch(TILE_ARCH* tile_arch, int rest_tile1, int rest_tile2)
{
int i;
int j;

for(i=0; i<9; i++)
{
for(j=0; jkind_list[i]; j++)
{
printf("(%d%d%d)", i+1, i+1, i+1);
}

for(j=0; jstair_list[i]; j++)
{
printf("(%d%d%d)", i+1, i+2, i+3);
}
}

if(tile_arch->head != -1)
{
printf("(%d%d)", tile_arch->head+1, tile_arch->head+1);
}

if(rest_tile2 == -1)
{
printf("[%d]\n", rest_tile1+1);
}
else
{
printf("[%d%d]\n", rest_tile1+1, rest_tile2+1);
}
}

// 順子構成可能調査
int stair_constructible(int* tiles, int min)
{
int i;
int stair_count;

stair_count = 0;
for(i=min; i<9; i++)
{
if(tiles[i] >= 1)
{
stair_count++;
}
else
{
stair_count = 0;
}

if(stair_count >= 3)
{
return i-2;
}
}

return -1;
}

// 刻子構成可能調査
int kind_constructible(int* tiles, int min)
{
int i;

for(i=min; i<9; i++)
{
if(tiles[i] >= 3)
{
return i;
}
}

return -1;
}

// 頭構成可能調査
int head_constructible(int* tiles, int min)
{
int i;

for(i=min; i<9; i++)
{
if(tiles[i] >= 2)
{
return i;
}
}

return -1;
}

// 搭子・単騎使用可能調査
int usable_rest_tiles(TILE_ARCH* tile_arch, int* rest_tile1, int* rest_tile2)
{
int i;

*rest_tile1 = -1;
*rest_tile2 = -1;
if(tile_arch->rest == 1)
{
for(i=0; i<9; i++)
{
if(tile_arch->tiles[i] > 0)
{
*rest_tile1 = i;

return 1;
}
}
}
else if(tile_arch->rest == 2)
{
for(i=0; i<9; i++)
{
if(tile_arch->tiles[i] >= 2)
{
*rest_tile1 = i;
*rest_tile2 = i;

break;
}
else if(tile_arch->tiles[i] == 1)
{
if(*rest_tile1 == -1)
{
*rest_tile1 = i;
}
else
{
*rest_tile2 = i;
break;
}
}
}

if(
(*rest_tile1 == *rest_tile2) ||
((*rest_tile1+1) == *rest_tile2) ||
((*rest_tile1+2) == *rest_tile2))
{
return 1;
}
}

return 0;
}

// 牌構成解析 再帰用
void tile_arch_analysis(TILE_ARCH* tile_arch, int min)
{
int tile_no;
int i;
int result;

if(tile_arch->rest <= 2)
{
int rest_tile1;
int rest_tile2;

result = usable_rest_tiles(tile_arch, &rest_tile1, &rest_tile2);
if(result)
{
print_tile_arch(tile_arch, rest_tile1, rest_tile2);
}
return;
}

for(i=min; i<9; i++)
{
tile_no = stair_constructible(tile_arch->tiles, i);
if(tile_no != -1)
{
tile_arch->tiles[tile_no]--;
tile_arch->tiles[tile_no+1]--;
tile_arch->tiles[tile_no+2]--;
tile_arch->stair_list[tile_no]++;
tile_arch->rest -= 3;

tile_arch_analysis(tile_arch, tile_no);

tile_arch->tiles[tile_no]++;
tile_arch->tiles[tile_no+1]++;
tile_arch->tiles[tile_no+2]++;
tile_arch->stair_list[tile_no]--;
tile_arch->rest += 3;

i = tile_no;
}
}

for(i=min; i<9; i++)
{
tile_no = kind_constructible(tile_arch->tiles, i);
if(tile_no != -1)
{
tile_arch->tiles[tile_no] -= 3;
tile_arch->kind_list[tile_no]++;
tile_arch->rest -= 3;

tile_arch_analysis(tile_arch, tile_no+1);

tile_arch->tiles[tile_no] += 3;
tile_arch->kind_list[tile_no]--;
tile_arch->rest += 3;

i = tile_no;
}
}

if(tile_arch->head == -1)
{
for(i=min; i<9; i++)
{
tile_no = head_constructible(tile_arch->tiles, i);
if(tile_no != -1)
{
tile_arch->tiles[tile_no] -= 2;
tile_arch->head = tile_no;
tile_arch->rest -= 2;

tile_arch_analysis(tile_arch, tile_no+1);

tile_arch->tiles[tile_no] += 2;
tile_arch->head = -1;
tile_arch->rest += 2;

i = tile_no;
}
}
}
}


int main(int argc, char** argv)
{
char tiles[14];
TILE_ARCH tile_arch;

fgets(tiles, sizeof(tiles), stdin);
if(!make_tile_arch(&tile_arch, tiles))
{
fprintf(stderr, "invalid tiles\n");
return -1;
}

tile_arch_analysis(&tile_arch, 0);

return 0;
}



清一色限定解除もやってみました。
makeplex salonの麻雀問題の清一色限定解除やてみたよ

4/25
他の方のをいろいろ見てみて思ったけど、
順子、刻子、頭の検索を関数化したのは処理が分散してわかりずらいですね。
メインのループで一緒にやっちゃった方がよかった。
処理負荷的には大して影響ないのは救いか。
 

<< makeplex salonの麻雀問題の清一色限定解除やてみたよ | Home | フロントミッションオンライン -ぶらりハフマンひとり旅- 2005/5~2008/5 >>

コメント

コメントの投稿

URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 

トラックバック


この記事にトラックバックする(FC2ブログユーザー)


 BLOG TOP 


template and material by HPテンプレート素材集IFD
  1. 無料アクセス解析
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。