結果

問題 No.331 CodeRunnerでやれ
ユーザー asugen0402asugen0402
提出日時 2019-03-27 13:29:04
言語 C
(gcc 12.3.0)
結果
AC  
実行時間 349 ms / 5,000 ms
コード長 3,767 bytes
コンパイル時間 232 ms
コンパイル使用メモリ 30,176 KB
実行使用メモリ 24,324 KB
平均クエリ数 398.35
最終ジャッジ日時 2023-09-24 02:09:11
合計ジャッジ時間 6,529 ms
ジャッジサーバーID
(参考情報)
judge15 / judge14
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 135 ms
24,324 KB
testcase_01 AC 139 ms
24,000 KB
testcase_02 AC 146 ms
23,464 KB
testcase_03 AC 349 ms
24,064 KB
testcase_04 AC 145 ms
23,604 KB
testcase_05 AC 150 ms
23,712 KB
testcase_06 AC 311 ms
23,904 KB
testcase_07 AC 161 ms
23,868 KB
testcase_08 AC 317 ms
24,256 KB
testcase_09 AC 174 ms
24,040 KB
testcase_10 AC 228 ms
23,560 KB
testcase_11 AC 205 ms
23,620 KB
testcase_12 AC 210 ms
24,256 KB
testcase_13 AC 226 ms
23,592 KB
testcase_14 AC 232 ms
23,460 KB
testcase_15 AC 208 ms
23,476 KB
testcase_16 AC 309 ms
23,452 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <float.h>
#include <limits.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

// 内部定数
#define D_ON			1										// 汎用フラグ - ON
#define D_OFF			0										// 汎用フラグ - OFF
#define D_SIZE_MAX		25										// 最大サイズ
#define D_WAY_CNT		4										// 方向種類数
#define D_WAY_R			0										// 方向 - 右
#define D_WAY_D			1										// 方向 - 下
#define D_WAY_L			2										// 方向 - 左
#define D_WAY_U			3										// 方向 - 上

// 内部変数
static FILE *szpFpI;											// 入力
static char sc2Done[D_SIZE_MAX * 2][D_SIZE_MAX * 2];			// 処理済フラグ

// 内部変数 - テスト用
#ifdef D_TEST
	static int siRes;
	static FILE *szpFpA;
	static int siTNo;
#endif

// 出力
int
fOut(
	char *pcpLine				// <I> 1行
)
{
	char lc1Buf[1024];

#ifdef D_TEST
	fgets(lc1Buf, sizeof(lc1Buf), szpFpA);
	if (strcmp(lc1Buf, pcpLine)) {
		siRes = -1;
	}
#else
	printf("%s", pcpLine);
	fflush(stdout);
#endif

	return 0;
}

// 入力
int
fIn(
)
{
	char lc1Buf[1024];

	fgets(lc1Buf, sizeof(lc1Buf), szpFpI);
	if (lc1Buf[0] == 'M') {
		return -1;
	}

	// 進めるセル数 - 取得
	int liCnt;
	sscanf(lc1Buf, "%d", &liCnt);

	return liCnt;
}

// 行動
int
fAct(
	char pcAct					// <I> 行動内容
)
{
	char lc1Buf[1024];

	// 行動
	sprintf(lc1Buf, "%c\n", pcAct);
	fOut(lc1Buf);

	// 進めるセル数 - 取得
	return fIn();
}

// 移動量 - 取得
int
fGetMove(
	int piWay					// <I> 方向
	, int *pipMx				// <I> 移動量X
	, int *pipMy				// <I> 移動量Y
)
{
	// 初期化
	*pipMx = 0;
	*pipMy = 0;

	// 移動量 - セット
	switch (piWay) {
		case D_WAY_R:	*pipMx = 1;		break;
		case D_WAY_D:	*pipMy = 1;		break;
		case D_WAY_L:	*pipMx = -1;	break;
		case D_WAY_U:	*pipMy = -1;	break;
	}

	return 0;
}

// 移動
int
fMove(
	int piX						// <I> 位置X
	, int piY					// <I> 位置Y
	, int piWay					// <I> 方向
	, int piCnt					// <I> 進めるセル数
)
{
	int i, liRet;

	// 処理済フラグ - セット
	sc2Done[piX][piY] = D_ON;

	// 4方向をチェック
	for (i = 0; i < D_WAY_CNT; i++) {

		// 方向
		int liWay = (piWay + i) % D_WAY_CNT;

		// 進めるセル数
		if (piCnt > 0) {

			// 移動先 - 取得
			int liMx, liMy;
			fGetMove(liWay, &liMx, &liMy);
			int liX = piX + liMx;
			int liY = piY + liMy;

			// 処理済フラグ - チェック
			if (sc2Done[liX][liY] == D_OFF) {

				// 進む
				piCnt = fAct('F');
				if (piCnt < 0) {
					return 0;
				}

				// 移動先のマス
				liRet = fMove(liX, liY, liWay, piCnt);
				if (liRet == 0) {
					return 0;
				}

				// 戻る
				fAct('B');
			}
		}

		// 回転
		piCnt = fAct('R');
	}

	return -1;
}

// 実行メイン
int
fMain(
)
{
	// 進めるセル数 - 取得
	int liCnt = fIn();

	// 移動
	fMove(D_SIZE_MAX, D_SIZE_MAX, D_WAY_D, liCnt);

	return 0;
}

// 1回実行
int
fOne(
)
{
	int liRet;
	char lc1Buf[1024];

	// 入力 - セット
#ifdef D_TEST
	sprintf(lc1Buf, ".\\Test\\T%d.txt", siTNo);
	szpFpI = fopen(lc1Buf, "r");
	sprintf(lc1Buf, ".\\Test\\A%d.txt", siTNo);
	szpFpA = fopen(lc1Buf, "r");
	siRes = 0;
#else
	szpFpI = stdin;
#endif

	// 実行メイン
	liRet = fMain();

	// 残データ有無
#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", siTNo);
	}
	else {
		printf("NG %d\n", siTNo);
	}
#endif

	return 0;
}

// プログラム開始
int
main()
{

#ifdef D_TEST
	int i;
	for (i = D_TEST_SNO; i <= D_TEST_ENO; i++) {
		siTNo = i;
		fOne();
	}
#else
	fOne();
#endif

	return 0;
}

0