結果
問題 | No.13 囲みたい! |
ユーザー |
![]() |
提出日時 | 2015-06-24 22:11:24 |
言語 | C90 (gcc 12.3.0) |
結果 |
AC
|
実行時間 | 129 ms / 5,000 ms |
コード長 | 1,921 bytes |
コンパイル時間 | 431 ms |
コンパイル使用メモリ | 22,272 KB |
実行使用メモリ | 5,248 KB |
最終ジャッジ日時 | 2024-10-13 10:44:31 |
合計ジャッジ時間 | 1,335 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 16 |
コンパイルメッセージ
main.c: In function ‘main’: main.c:56:3: warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 56 | scanf("%d", &W); | ^~~~~~~~~~~~~~~ main.c:57:3: warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 57 | scanf("%d", &H); | ^~~~~~~~~~~~~~~ main.c:61:7: warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 61 | scanf("%d", &(M[i+W*j])); | ^~~~~~~~~~~~~~~~~~~~~~~~
ソースコード
#include <stdio.h> #include <stdlib.h> int W = 0; int H = 0; int *M = 0; int Target = -1; char *Move = 0; int *Path = 0; int Shift = 8; int move(int i, int j, int move_no) { int rc = 0; if ((0<=i) && (i<W) && (0<=j) && (j<H)) { if (M[i+W*j]==Target) { if (move_no >= 2) { if (Path[move_no-2] == ((i << Shift) | j)) { rc = 0; goto END; } else { Path[move_no] = (i << Shift) | j; } } else { Path[move_no] = (i << Shift) | j; } } else { rc = 0; goto END; } } else { rc = 0; goto END; } if (Move[i+W*j] == 1) { rc = 1; } else { Move[i+W*j] = 1; if (1 == move(i+1, j, move_no+1)) { rc = 1; } else if (1 == move(i, j+1, move_no+1)) { rc = 1; } else if (1 == move(i-1, j, move_no+1)) { rc = 1; } else if (1 == move(i, j-1, move_no+1)) { rc = 1; } else { rc = 0; } } END: ; return rc; } int main() { int i, j; scanf("%d", &W); scanf("%d", &H); M = (int*)malloc(sizeof(int)*W*H); for (j=0; j<H; j++) { for (i=0; i<W; i++) { scanf("%d", &(M[i+W*j])); } } char *ans = "impossible"; char *visit; Move = (char*)malloc(sizeof(char)*W*H); visit = (char*)malloc(sizeof(char)*W*H); Path = (int*)malloc(sizeof(int)*W*H); for (j=0; j<H; j++) { for (i=0; i<W; i++) { Move[i+W*j] = 0; visit[i+W*j] = 0; } } for (j=0; j<H; j++) { for (i=0; i<W; i++) { if (visit[i+W*j] == 0) { Target = M[i+W*j]; if (1 == move(i, j, 0)) { ans = "possible"; goto END; } else { int ii, jj; for (jj=0; jj<H; jj++) { for (ii=0; ii<W; ii++) { visit[ii+W*jj] |= Move[ii+W*jj]; Move[ii+W*jj] = 0; } } } } } } END: ; printf("%s\n", ans); return 0; }