結果
| 問題 |
No.13 囲みたい!
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2024-02-17 11:36:07 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 115 ms / 5,000 ms |
| コード長 | 3,615 bytes |
| コンパイル時間 | 633 ms |
| コンパイル使用メモリ | 72,312 KB |
| 最終ジャッジ日時 | 2025-02-19 15:23:28 |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 16 |
ソースコード
#include <iostream>
#include <vector>
using namespace std;
int main(void) {
int W, H;
cin >> W >> H;
int M[H + 2][W + 2];
int maxM = 0;
for (int i = 0; i < H + 2; i++) {
for (int j = 0; j < W + 2; j++) {
if (i*j == 0 || (i-H-1)*(j-W-1) == 0) {
M[i][j] = 0;
} else {
cin >> M[i][j];
maxM = max(maxM, M[i][j]);
}
}
}
//-1: なし 0: 未探索 >1: 探索済
for (int k = 1; k < maxM + 1; k++) {
int numver = 0; // the number of vertices
int vertices[H + 2][W + 2];
for (int i = 0; i < H + 2; i++) {
for (int j = 0; j < W + 2; j++) {
if (M[i][j] == k) {
numver++;
vertices[i][j] = 0;
} else {
vertices[i][j] = -1;
}
}
}
int step = 1;
for (int i = 1; i < H + 1; i++) {
for (int j = 1; j < W + 1; j++) {
if (vertices[i][j] == 0) {
vertices[i][j] = step;
for (int l = 0; l < numver; l++) {
int changed = 0;
for (int i2 = 1; i2 < H + 1; i2++) {
for (int j2 = 1; j2 < W + 1; j2++) {
if (vertices[i2][j2] == step) {
int counter = 0;
int* tar = &vertices[i2][j2-1];
if (*tar == 0) {
*tar = step + 1;
changed = 1;
} else if (*tar > 0 && *tar <= step) {
counter++;
}
tar = &vertices[i2][j2+1];
if (*tar == 0) {
*tar = step + 1;
changed = 1;
} else if (*tar > 0 && *tar <= step) {
counter++;
}
tar = &vertices[i2-1][j2];
if (*tar == 0) {
*tar = step + 1;
changed = 1;
} else if (*tar > 0 && *tar <= step) {
counter++;
}
tar = &vertices[i2+1][j2];
if (*tar == 0) {
*tar = step + 1;
changed = 1;
} else if (*tar > 0 && *tar <= step) {
counter++;
}
if (counter > 1) {
cout << "possible" << endl;
return 0;
}
}
}
}
step++;
if (!changed) {
break;
}
}
} else {
}
}
}
}
cout << "impossible" << endl;
return 0;
}