結果
| 問題 |
No.340 雪の足跡
|
| コンテスト | |
| ユーザー |
asugen0402
|
| 提出日時 | 2019-02-13 12:12:03 |
| 言語 | C (gcc 13.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 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 5 |
| other | AC * 32 |
ソースコード
#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;
}
asugen0402