#include #include #include #include #include #include #include // 内部定数 #define D_BLOCK_CNT 30 // ブロック数 // 内部変数 static FILE *szpFpI; // 入力 static int siKR, siKB; // 条件 static char sc1Block[D_BLOCK_CNT + 5]; // ブロック static int siMax; // 最大個数 // 内部変数 - テスト用 #ifdef D_TEST static int siRes; static FILE *szpFpA; #endif // 判定 - 1ブロック int fJudge( char *pcpBlock // ブロック , int piBCnt // ブロック数 , int piBNo // ブロック位置 , char pcColor // 対象色 , int piCNo // チェック位置 ) { // 対象色 if (pcpBlock[piBNo] != pcColor) { return 0; } // 左側 int liBNo = piBNo - piCNo; if (liBNo >= 0) { if (pcpBlock[liBNo] == pcColor) { return -1; } } // 右側 liBNo = piBNo + piCNo; if (liBNo < piBCnt) { if (pcpBlock[liBNo] == pcColor) { return -1; } } return 0; } // 最大個数 - 更新 int fUpMax( ) { int i, liRet; // 削除ブロックを詰める int liBCnt = 0; char lc1Block[D_BLOCK_CNT]; for (i = 0; i < D_BLOCK_CNT; i++) { if (sc1Block[i] > 0) { lc1Block[liBCnt] = sc1Block[i]; liBCnt++; } } // 各ブロックをチェック for (i = 0; i < liBCnt; i++) { liRet = fJudge(lc1Block, liBCnt, i, 'R', siKR); if (liRet != 0) { return 0; } liRet = fJudge(lc1Block, liBCnt, i, 'B', siKB); if (liRet != 0) { return 0; } } // 最大個数 - 更新 if (siMax < liBCnt) { siMax = liBCnt; } return 0; } // ブロック - 削除 int fDelBlock( int piBNo // ブロック位置 ) { // 削除終了 if (piBNo >= D_BLOCK_CNT) { return fUpMax(); // 最大個数 - 更新 } // 削除しない fDelBlock(piBNo + 1); // 削除 char lcBlock = sc1Block[piBNo]; if (lcBlock != 'W') { sc1Block[piBNo] = 0; fDelBlock(piBNo + 1); } // 戻す sc1Block[piBNo] = lcBlock; return 0; } // 実行メイン int fMain( ) { char lc1Buf[1024]; // 条件 - 取得 fgets(lc1Buf, sizeof(lc1Buf), szpFpI); sscanf(lc1Buf, "%d%d", &siKR, &siKB); // ブロック - 取得 fgets(sc1Block, sizeof(sc1Block), szpFpI); // ブロック - 削除 fDelBlock(0); return 0; } // 1回実行 int fOne( int piTNo // テスト番号 1~ ) { char lc1Buf[1024], lc1Out[1024]; // データ - 初期化 siMax = 0; // 最大個数 // 入力 - セット #ifdef D_TEST sprintf(lc1Buf, ".\\Test\\T%d.txt", piTNo); szpFpI = fopen(lc1Buf, "r"); sprintf(lc1Buf, ".\\Test\\A%d.txt", piTNo); szpFpA = fopen(lc1Buf, "r"); siRes = 0; #else szpFpI = stdin; #endif // 実行メイン fMain(); // 結果 - セット sprintf(lc1Out, "%d\n", siMax); // 結果 - 表示 #ifdef D_TEST fgets(lc1Buf, sizeof(lc1Buf), szpFpA); if (strcmp(lc1Buf, lc1Out)) { siRes = -1; } #else printf("%s", lc1Out); #endif // 残データ有無 #ifdef D_TEST lc1Buf[0] = '\0'; fgets(lc1Buf, sizeof(lc1Buf), szpFpA); if (strcmp(lc1Buf, "")) { siRes = -1; } #endif // テストファイルクローズ #ifdef D_TEST fclose(szpFpI); fclose(szpFpA); #endif // テスト結果 #ifdef D_TEST if (siRes == 0) { printf("OK %d\n", piTNo); } else { printf("NG %d\n", piTNo); } #endif return 0; } // プログラム開始 int main() { #ifdef D_TEST int i; for (i = D_TEST_SNO; i <= D_TEST_ENO; i++) { fOne(i); } #else fOne(0); #endif return 0; }