#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct {
int size;
int len;
char *v;
} Vector;
static void v_free(Vector *v) {
}
static Vector *v_new(char size) {
Vector
*v
= calloc(1, sizeof(*v
)); v->size = size;
v
->v
= calloc(size
, sizeof(char)); return v;
}
static void v_resize(Vector *v, int size) {
v
->v
= realloc(v
->v
, sizeof(int) * size
); v->size = size;
}
static void v_push(Vector *v, int elem) {
if (v->len >= v->size) {
v_resize(v, v->size * 2);
}
v->v[v->len++] = elem;
}
static int v_len(Vector *v) {
return v->len;
}
static void v_print(Vector *v) {
for (int i = 0; i < v->len; i++) {
}
}
static char v_get(const Vector *v, int i) {
if (i < 0 || i >= v->len) {
return '\0';
}
return v->v[i];
}
static void v_set(Vector *v, int i, char ch) {
v->v[i] = ch;
}
typedef struct {
int size;
int len;
Vector **rows;
} Matrix;
static void m_free(Matrix *m) {
for (int i = 0; i < m->len; i++) {
Vector *v = m->rows[i];
v_free(v);
}
}
static Matrix *m_new(int size) {
Matrix
*m
= calloc(1, sizeof(*m
)); m->size = size;
m
->rows
= calloc(size
, sizeof(Vector
*)); return m;
}
static void m_resize(Matrix *m, int size) {
m
->rows
= realloc(m
->rows
, sizeof(Vector
*) * size
); m->size = size;
}
static void m_push(Matrix *m, Vector *v) {
if (m->len >= m->size) {
m_resize(m, m->size * 2);
}
m->rows[m->len++] = v;
}
static void m_print(const Matrix *m) {
for (int i = 0; i < m->len; i++) {
Vector *v = m->rows[i];
v_print(v);
}
}
static int m_len_rows(const Matrix *m) {
return m->len;
}
static int m_len_cols(const Matrix *m) {
if (m->len <= 0) {
return -1;
}
return v_len(m->rows[0]);
}
static char m_get(const Matrix *m, int r, int c) {
return v_get(m->rows[r], c);
}
static void m_set(Matrix *m, int r, int c, char ch) {
Vector *v = m->rows[r];
v_set(v, c, ch);
}
static bool dfs(Matrix *m, int total, int sr, int sc, int dep) {
static int dx[] = {-1, 0, 1, 0};
static int dy[] = {0, -1, 0, 1};
int r = m_len_rows(m);
int c = m_len_cols(m);
if (total == dep) {
return true;
}
for (int k = 0; k < 4; k++) {
int r2 = sr + dy[k];
int c2 = sc + dx[k];
if (r2 < 0 || r2 >= r || c2 < 0 || r2 >= c) {
continue;
}
if (m_get(m, r2, c2) != '0') {
continue;
}
m_set(m, r2, c2, '2');
if (dfs(m, total, r2, c2, dep + 1)) {
return true;
}
m_set(m, r2, c2, '0');
}
return false;
}
int main(void) {
int r, c;
for (;;) {
if (scanf("%d %d\n", &r
, &c
) == EOF
) { break;
}
Matrix *m = m_new(r);
int total = 0, sr = 0, sc = 0;
for (int i = 0; i < r; i++) {
Vector *v = v_new(c);
for (int j = 0; j < c; j++) {
v_push(v, ch);
if (ch == '0') {
total++;
} else if (ch == '2') {
sr = i;
sc = j;
}
}
m_push(m, v);
}
m_print(m);
if (dfs(m, total, sr, sc, 0)) {
} else {
}
m_free(m);
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGJvb2wuaD4KCnR5cGVkZWYgc3RydWN0IHsKICAgIGludCBzaXplOwogICAgaW50IGxlbjsKICAgIGNoYXIgKnY7Cn0gVmVjdG9yOwoKc3RhdGljIHZvaWQgdl9mcmVlKFZlY3RvciAqdikgewogICAgZnJlZSh2LT52KTsKICAgIGZyZWUodik7Cn0KCnN0YXRpYyBWZWN0b3IgKnZfbmV3KGNoYXIgc2l6ZSkgewogICAgVmVjdG9yICp2ID0gY2FsbG9jKDEsIHNpemVvZigqdikpOwogICAgdi0+c2l6ZSA9IHNpemU7CiAgICB2LT52ID0gY2FsbG9jKHNpemUsIHNpemVvZihjaGFyKSk7CiAgICByZXR1cm4gdjsKfQoKc3RhdGljIHZvaWQgdl9yZXNpemUoVmVjdG9yICp2LCBpbnQgc2l6ZSkgewogICAgdi0+diA9IHJlYWxsb2Modi0+diwgc2l6ZW9mKGludCkgKiBzaXplKTsKICAgIHYtPnNpemUgPSBzaXplOwp9CgpzdGF0aWMgdm9pZCB2X3B1c2goVmVjdG9yICp2LCBpbnQgZWxlbSkgewogICAgaWYgKHYtPmxlbiA+PSB2LT5zaXplKSB7CiAgICAgICAgdl9yZXNpemUodiwgdi0+c2l6ZSAqIDIpOwogICAgfQogICAgdi0+dlt2LT5sZW4rK10gPSBlbGVtOwp9CgpzdGF0aWMgaW50IHZfbGVuKFZlY3RvciAqdikgewogICAgcmV0dXJuIHYtPmxlbjsKfQoKc3RhdGljIHZvaWQgdl9wcmludChWZWN0b3IgKnYpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdi0+bGVuOyBpKyspIHsKICAgICAgICBwcmludGYoIiVjIiwgdi0+dltpXSk7CiAgICB9CiAgICBwcmludGYoIlxuIik7Cn0KCnN0YXRpYyBjaGFyIHZfZ2V0KGNvbnN0IFZlY3RvciAqdiwgaW50IGkpIHsKICAgIGlmIChpIDwgMCB8fCBpID49IHYtPmxlbikgewogICAgICAgIHJldHVybiAnXDAnOwogICAgfQogICAgcmV0dXJuIHYtPnZbaV07Cn0KCnN0YXRpYyB2b2lkIHZfc2V0KFZlY3RvciAqdiwgaW50IGksIGNoYXIgY2gpIHsKICAgIHYtPnZbaV0gPSBjaDsKfQoKdHlwZWRlZiBzdHJ1Y3QgewogICAgaW50IHNpemU7CiAgICBpbnQgbGVuOwogICAgVmVjdG9yICoqcm93czsKfSBNYXRyaXg7CgpzdGF0aWMgdm9pZCBtX2ZyZWUoTWF0cml4ICptKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG0tPmxlbjsgaSsrKSB7CiAgICAgICAgVmVjdG9yICp2ID0gbS0+cm93c1tpXTsKICAgICAgICB2X2ZyZWUodik7CiAgICB9CiAgICBmcmVlKG0tPnJvd3MpOwogICAgZnJlZShtKTsKfQoKc3RhdGljIE1hdHJpeCAqbV9uZXcoaW50IHNpemUpIHsKICAgIE1hdHJpeCAqbSA9IGNhbGxvYygxLCBzaXplb2YoKm0pKTsKICAgIG0tPnNpemUgPSBzaXplOwogICAgbS0+cm93cyA9IGNhbGxvYyhzaXplLCBzaXplb2YoVmVjdG9yICopKTsKICAgIHJldHVybiBtOwp9CgpzdGF0aWMgdm9pZCBtX3Jlc2l6ZShNYXRyaXggKm0sIGludCBzaXplKSB7CiAgICBtLT5yb3dzID0gcmVhbGxvYyhtLT5yb3dzLCBzaXplb2YoVmVjdG9yICopICogc2l6ZSk7CiAgICBtLT5zaXplID0gc2l6ZTsKfQoKc3RhdGljIHZvaWQgbV9wdXNoKE1hdHJpeCAqbSwgVmVjdG9yICp2KSB7CiAgICBpZiAobS0+bGVuID49IG0tPnNpemUpIHsKICAgICAgICBtX3Jlc2l6ZShtLCBtLT5zaXplICogMik7CiAgICB9CiAgICBtLT5yb3dzW20tPmxlbisrXSA9IHY7Cn0KCnN0YXRpYyB2b2lkIG1fcHJpbnQoY29uc3QgTWF0cml4ICptKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG0tPmxlbjsgaSsrKSB7CiAgICAgICAgVmVjdG9yICp2ID0gbS0+cm93c1tpXTsKICAgICAgICB2X3ByaW50KHYpOwogICAgfQp9CgpzdGF0aWMgaW50IG1fbGVuX3Jvd3MoY29uc3QgTWF0cml4ICptKSB7CiAgICByZXR1cm4gbS0+bGVuOwp9CgpzdGF0aWMgaW50IG1fbGVuX2NvbHMoY29uc3QgTWF0cml4ICptKSB7CiAgICBpZiAobS0+bGVuIDw9IDApIHsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CiAgICByZXR1cm4gdl9sZW4obS0+cm93c1swXSk7Cn0KCnN0YXRpYyBjaGFyIG1fZ2V0KGNvbnN0IE1hdHJpeCAqbSwgaW50IHIsIGludCBjKSB7CiAgICByZXR1cm4gdl9nZXQobS0+cm93c1tyXSwgYyk7Cn0KCnN0YXRpYyB2b2lkIG1fc2V0KE1hdHJpeCAqbSwgaW50IHIsIGludCBjLCBjaGFyIGNoKSB7CiAgICBWZWN0b3IgKnYgPSBtLT5yb3dzW3JdOwogICAgdl9zZXQodiwgYywgY2gpOwp9IAoKc3RhdGljIGJvb2wgZGZzKE1hdHJpeCAqbSwgaW50IHRvdGFsLCBpbnQgc3IsIGludCBzYywgaW50IGRlcCkgewogICAgc3RhdGljIGludCBkeFtdID0gey0xLCAwLCAxLCAwfTsKICAgIHN0YXRpYyBpbnQgZHlbXSA9IHswLCAtMSwgMCwgMX07CiAgICBpbnQgciA9IG1fbGVuX3Jvd3MobSk7CiAgICBpbnQgYyA9IG1fbGVuX2NvbHMobSk7CiAgICBpZiAodG90YWwgPT0gZGVwKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgZm9yIChpbnQgayA9IDA7IGsgPCA0OyBrKyspIHsKICAgICAgICBpbnQgcjIgPSBzciArIGR5W2tdOwogICAgICAgIGludCBjMiA9IHNjICsgZHhba107CiAgICAgICAgaWYgKHIyIDwgMCB8fCByMiA+PSByIHx8IGMyIDwgMCB8fCByMiA+PSBjKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAobV9nZXQobSwgcjIsIGMyKSAhPSAnMCcpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIG1fc2V0KG0sIHIyLCBjMiwgJzInKTsKICAgICAgICBpZiAoZGZzKG0sIHRvdGFsLCByMiwgYzIsIGRlcCArIDEpKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICBtX3NldChtLCByMiwgYzIsICcwJyk7CiAgICB9CgogICAgcmV0dXJuIGZhbHNlOwp9CgppbnQgbWFpbih2b2lkKSB7CiAgICBpbnQgciwgYzsKCiAgICBmb3IgKDs7KSB7CiAgICAgICAgaWYgKHNjYW5mKCIlZCAlZFxuIiwgJnIsICZjKSA9PSBFT0YpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBNYXRyaXggKm0gPSBtX25ldyhyKTsKICAgICAgICBpbnQgdG90YWwgPSAwLCBzciA9IDAsIHNjID0gMDsKCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByOyBpKyspIHsKICAgICAgICAgICAgVmVjdG9yICp2ID0gdl9uZXcoYyk7CiAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgYzsgaisrKSB7CiAgICAgICAgICAgICAgICBjaGFyIGNoID0gZmdldGMoc3RkaW4pOwogICAgICAgICAgICAgICAgdl9wdXNoKHYsIGNoKTsKICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnMCcpIHsKICAgICAgICAgICAgICAgICAgICB0b3RhbCsrOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnMicpIHsKICAgICAgICAgICAgICAgICAgICBzciA9IGk7CiAgICAgICAgICAgICAgICAgICAgc2MgPSBqOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZnZXRjKHN0ZGluKTsgLy8gXG4KICAgICAgICAgICAgbV9wdXNoKG0sIHYpOwogICAgICAgIH0KICAgICAgICBmZ2V0YyhzdGRpbik7IC8vIFxuCgogICAgICAgIG1fcHJpbnQobSk7CiAgICAgICAgaWYgKGRmcyhtLCB0b3RhbCwgc3IsIHNjLCAwKSkgewogICAgICAgICAgICBwdXRzKCJPSyIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHB1dHMoIk5HIik7CiAgICAgICAgfQogICAgICAgIHB1dHMoIiIpOwoKICAgICAgICBtX2ZyZWUobSk7CiAgICB9CiAgICAKICAgIHJldHVybiAwOwp9