제출 #74395

#제출 시각아이디문제언어결과실행 시간메모리
74395vvv3334Mecho (IOI09_mecho)C11
49 / 100
233 ms44364 KiB
//baekjoon_10216 #pragma warning(disable : 4996) #include <stdio.h> #include <stdlib.h> int N, S; int MAP[1000][1000]; char str[810]; int CHANGE['Z'+1]; int sr, sc, er, ec; int VISIT[1000][1000]; typedef struct st { int r; int c; int time; }QUEUE; QUEUE Que[810 * 810]; int WP, RP; void input() { int i, k, tmp; CHANGE['T'] = -1; CHANGE['G'] = 0; CHANGE['H'] = 1; CHANGE['M'] = 0; CHANGE['D'] = 0x7fff0000; scanf("%d %d", &N, &S); for (i = 1; i <= N;i++) { scanf("%s", str + 1); for (k = 1; k <= N;k++) { if (str[k] == 'M') { sr = i; sc = k; } else if(str[k] == 'D') { er = i; ec = k; } MAP[i][k] = CHANGE[str[k]]; } } //printf("%d %d %d %d\n", sr, sc, er, ec); } void output() { int i, k; for (i = 1; i <= N;i++) { for (k = 1; k <= N;k++) printf("%2d ", MAP[i][k]); putchar('\n'); } putchar('\n'); } void outputVISIT() { int i, k; for (i = 1; i <= N;i++) { for (k = 1; k <= N;k++) printf("%2d ", VISIT[i][k]); putchar('\n'); } putchar('\n'); } int dr[] = { 0,1,0,-1 }; int dc[] = { 1,0,-1,0 }; void BFS() { int i, nr, nc; QUEUE out; while (WP > RP) { out = Que[RP++]; for (i = 0; i < 4;i++) { nr = out.r + dr[i]; nc = out.c + dc[i]; if (nr < 1 || nc < 1 || nr > N || nc > N) continue; if (MAP[nr][nc] == 0) { Que[WP].r = nr; Que[WP++].c = nc; MAP[nr][nc] = MAP[out.r][out.c] + 1; } } } } int BFS2(int mid) { int i, k, nr, nc; QUEUE out; if (mid == MAP[sr][sc]-1 ) return 0; WP = RP = 0; for (i = 1; i <= N;i++) for (k = 1; k <= N;k++) VISIT[i][k] = 0; Que[WP].r = sr; Que[WP].c = sc; Que[WP++].time = mid; VISIT[sr][sc] = 1; while (WP > RP) { out = Que[RP++]; if (out.r == er && out.c == ec) return 1; for (i = 0; i < 4;i++) { nr = out.r + dr[i]; nc = out.c + dc[i]; if (nr < 1 || nc < 1 || nr > N || nc > N) continue; if (MAP[nr][nc] == -1 || VISIT[nr][nc] != 0) continue; if ((mid + (out.time-mid) / S) >= (MAP[nr][nc] - 1)) continue; Que[WP].r = nr; Que[WP].c = nc; Que[WP++].time = out.time + 1; VISIT[nr][nc] = (out.time - mid) / S + 1; } //outputVISIT(); } return 0; } int main() { int i, k; int right, left, mid; int tmp, ans; input(); //output(); for (i = 1; i <= N;i++) { for (k = 1; k <= N;k++) { if (MAP[i][k] == 1) { Que[WP].r = i; Que[WP++].c = k; } } } BFS(); /*output(); printf("%d\n",BFS2(5)); outputVISIT();*/ //return; left = 0; right = N * N; ans = -1; while (left <= right) { mid = (left + right) / 2; tmp = BFS2(mid); //printf("%d %d\n", tmp, mid); if (tmp) { ans = mid; left = mid + 1; } else right = mid - 1; } printf("%d\n", ans); return 0; }

컴파일 시 표준 에러 (stderr) 메시지

mecho.c:2:0: warning: ignoring #pragma warning  [-Wunknown-pragmas]
 #pragma warning(disable : 4996)
 
mecho.c: In function 'input':
mecho.c:52:22: warning: array subscript has type 'char' [-Wchar-subscripts]
    MAP[i][k] = CHANGE[str[k]];
                      ^
mecho.c:26:12: warning: unused variable 'tmp' [-Wunused-variable]
  int i, k, tmp;
            ^~~
mecho.c:34:2: warning: ignoring return value of 'scanf', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d", &N, &S);
  ^~~~~~~~~~~~~~~~~~~~~~
mecho.c:38:3: warning: ignoring return value of 'scanf', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%s", str + 1);
   ^~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...