結果

問題 No.340 雪の足跡
ユーザー asugen0402asugen0402
提出日時 2019-02-13 12:12:03
言語 C
(gcc 12.3.0)
結果
AC  
実行時間 628 ms / 1,000 ms
コード長 5,241 bytes
コンパイル時間 527 ms
コンパイル使用メモリ 34,176 KB
実行使用メモリ 495,732 KB
最終ジャッジ日時 2024-09-13 09:54:39
合計ジャッジ時間 19,230 ms
ジャッジサーバーID
(参考情報)
judge5 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 315 ms
495,724 KB
testcase_01 AC 312 ms
495,684 KB
testcase_02 AC 309 ms
495,508 KB
testcase_03 AC 309 ms
495,540 KB
testcase_04 AC 310 ms
495,500 KB
testcase_05 AC 341 ms
495,680 KB
testcase_06 AC 311 ms
495,724 KB
testcase_07 AC 309 ms
495,632 KB
testcase_08 AC 320 ms
495,672 KB
testcase_09 AC 310 ms
495,696 KB
testcase_10 AC 310 ms
495,612 KB
testcase_11 AC 309 ms
495,644 KB
testcase_12 AC 311 ms
495,712 KB
testcase_13 AC 310 ms
495,628 KB
testcase_14 AC 319 ms
495,636 KB
testcase_15 AC 322 ms
495,600 KB
testcase_16 AC 321 ms
495,664 KB
testcase_17 AC 373 ms
495,696 KB
testcase_18 AC 358 ms
495,732 KB
testcase_19 AC 325 ms
495,732 KB
testcase_20 AC 496 ms
495,676 KB
testcase_21 AC 406 ms
495,652 KB
testcase_22 AC 322 ms
495,560 KB
testcase_23 AC 493 ms
495,604 KB
testcase_24 AC 546 ms
495,720 KB
testcase_25 AC 448 ms
495,724 KB
testcase_26 AC 332 ms
495,728 KB
testcase_27 AC 313 ms
495,640 KB
testcase_28 AC 353 ms
495,728 KB
testcase_29 AC 506 ms
495,728 KB
testcase_30 AC 440 ms
495,648 KB
testcase_31 AC 565 ms
495,728 KB
testcase_32 AC 628 ms
495,600 KB
testcase_33 AC 569 ms
495,604 KB
testcase_34 AC 584 ms
495,728 KB
testcase_35 AC 506 ms
495,728 KB
testcase_36 AC 482 ms
495,732 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_SIZE_MAX		3005									// 最大サイズ

// 内部構造体 - 位置情報
typedef struct Pos {
	int miMin;													// 最短距離
	struct Pos *mzp1Pos[4];										// 接続位置
	int miPCnt;													// 接続位置数
} Pos;

// 内部変数
static FILE *szpFpI;											// 入力
static int si2Mx[D_SIZE_MAX][D_SIZE_MAX];						// 横移動[位置Y][位置X]
static int si2My[D_SIZE_MAX][D_SIZE_MAX];						// 縦移動[位置X][位置Y]
static int siW, siH;											// 幅・高さ
static Pos sz2Pos[D_SIZE_MAX][D_SIZE_MAX];						// 位置情報
static Pos *szp2Stack[2][D_SIZE_MAX];							// スタック
static int si1SCnt[2];											// スタック数

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

// 接続位置 - 追加
int
fAddPos(
	int piFx					// <I> 位置 - 元 - X
	, int piFy					// <I> 位置 - 元 - Y
	, int piTx					// <I> 位置 - 先 - X
	, int piTy					// <I> 位置 - 先 - Y
)
{
	sz2Pos[piFx][piFy].mzp1Pos[sz2Pos[piFx][piFy].miPCnt] = &sz2Pos[piTx][piTy];
	sz2Pos[piFx][piFy].miPCnt++;

	return 0;
}

// スタック - 追加
int
fAddStack(
	int piSNo					// <I> スタック番号 0 or 1
	, Pos *pzpPos				// <I> 位置情報
	, int piLen					// <I> 距離
)
{
	// 最短距離
	if (pzpPos->miMin <= piLen) {
		return 0;
	}
	pzpPos->miMin = piLen;

	// スタック - 追加
	szp2Stack[piSNo][si1SCnt[piSNo]] = pzpPos;
	si1SCnt[piSNo]++;

	return 0;
}

// 実行メイン
int
fMain(
	int piTNo					// <I> テスト番号 1~
)
{
	int i, j;
	char lc1Buf[1024], lc1Out[1024];

	// データ - 初期化
	memset(si2Mx, 0, sizeof(si2Mx));							// 横移動
	memset(si2My, 0, sizeof(si2My));							// 縦移動
	memset(sz2Pos, 0, sizeof(sz2Pos));							// 位置情報
	memset(si1SCnt, 0, sizeof(si1SCnt));						// スタック数

	// 入力 - セット
#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

	// 幅・高さ・人数 - 取得
	int liHCnt;
	fgets(lc1Buf, sizeof(lc1Buf), szpFpI);
	sscanf(lc1Buf, "%d%d%d", &siW, &siH, &liHCnt);

	// 人数でループ
	for (i = 0; i < liHCnt; i++) {

		// 経路数 - 取得
		int liRCnt;
		fgets(lc1Buf, sizeof(lc1Buf), szpFpI);
		sscanf(lc1Buf, "%d", &liRCnt);

		// 初期位置
		int liFrom;
		fscanf(szpFpI, "%d", &liFrom);

		// 経路 - 取得
		for (j = 0; j < liRCnt; j++) {
			int liTo;
			fscanf(szpFpI, "%d", &liTo);

			// 大小
			int liFNo, liTNo;
			if (liFrom < liTo) {
				liFNo = liFrom;
				liTNo = liTo;
			}
			else {
				liFNo = liTo;
				liTNo = liFrom;
			}

			// 商・剰余
			int liDF = liFNo / siW;
			int liDT = liTNo / siW;
			int liMF = liFNo % siW;
			int liMT = liTNo % siW;

			// 移動 - セット
			if (liDF == liDT) {									// 横移動
				si2Mx[liDF][liMF]++;
				si2Mx[liDF][liMT]--;
			}
			else {												// 縦移動
				si2My[liMF][liDF]++;
				si2My[liMF][liDT]--;
			}

			// 位置移動
			liFrom = liTo;
		}
		fgets(lc1Buf, sizeof(lc1Buf), szpFpI);
	}

	// 位置情報 - 接続位置 - セット
	for (i = 0; i < siH; i++) {
		int liSum = 0;
		for (j = 0; j < siW - 1; j++) {
			liSum += si2Mx[i][j];
			if (liSum > 0) {
				fAddPos(j, i, j + 1, i);
				fAddPos(j + 1, i, j, i);
			}
		}
	}
	for (i = 0; i < siW; i++) {
		int liSum = 0;
		for (j = 0; j < siH - 1; j++) {
			liSum += si2My[i][j];
			if (liSum > 0) {
				fAddPos(i, j, i, j + 1);
				fAddPos(i, j + 1, i, j);
			}
		}
	}

	// 最短距離 - 初期化
	for (i = 0; i < siW; i++) {
		for (j = 0; j < siH; j++) {
			sz2Pos[i][j].miMin = INT_MAX;
		}
	}

	// スタック - 初期位置
	int liSFNo = 0;
	fAddStack(liSFNo, &sz2Pos[0][0], 0);

	// 最短距離 - セット
	while (1) {
		int liSTNo = !liSFNo;

		// スタック数でループ
		for (i = 0; i < si1SCnt[liSFNo]; i++) {
			Pos *lzpPos = szp2Stack[liSFNo][i];

			// 各方向へ移動
			for (j = 0; j < lzpPos->miPCnt; j++) {
				fAddStack(liSTNo, lzpPos->mzp1Pos[j], lzpPos->miMin + 1);
			}
		}

		// スタック有無
		if (si1SCnt[liSTNo] < 1) {
			break;
		}

		// 次回用
		si1SCnt[liSFNo] = 0;
		liSFNo = liSTNo;
	}

	// 結果 - セット
	if (sz2Pos[siW - 1][siH - 1].miMin == INT_MAX) {
		sprintf(lc1Out, "Odekakedekinai..\n");
	}
	else {
		sprintf(lc1Out, "%d\n", sz2Pos[siW - 1][siH - 1].miMin);
	}

	// 結果 - 表示
#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++) {
		fMain(i);
	}
#else
	fMain(0);
#endif

	return 0;
}

0