Submission #74174655
Source Code Expand
Copy
#include <stdio.h>int m, n;int map[16][16];int ie_cnt = 0;int ie_id[16][16];int memo[12][1 << 22];int meow(int y, int x, int visited) {int *pmemo = NULL;int ans = 0;int i;if (map[y][x] == 2 && visited) return visited == (1 << ie_cnt) - 1;if (map[y][x] == 1) {int id = ie_id[y][x];/* TODO: 間引き方 (偶数IDのみメモ) とケースの相性が悪いと○されるかも? */if (id % 2 == 0 && ((visited >> id) & 1) == 0) {int mask = (1 << id) - 1;pmemo = &memo[id / 2][(visited & mask) | ((visited & ~mask) >> 1)];
#include <stdio.h>
int m, n;
int map[16][16];
int ie_cnt = 0;
int ie_id[16][16];
int memo[12][1 << 22];
int meow(int y, int x, int visited) {
int *pmemo = NULL;
int ans = 0;
int i;
if (map[y][x] == 2 && visited) return visited == (1 << ie_cnt) - 1;
if (map[y][x] == 1) {
int id = ie_id[y][x];
/* TODO: 間引き方 (偶数IDのみメモ) とケースの相性が悪いと○されるかも? */
if (id % 2 == 0 && ((visited >> id) & 1) == 0) {
int mask = (1 << id) - 1;
pmemo = &memo[id / 2][(visited & mask) | ((visited & ~mask) >> 1)];
}
}
if (pmemo != NULL && *pmemo) return ~*pmemo;
if (map[y][x] == 1) visited |= 1 << ie_id[y][x];
for (i = x - 1; i >= 0; i--) {
if (map[y][i] == 1 && ((visited >> ie_id[y][i]) & 1)) break;
if (map[y][i]) ans += meow(y, i, visited);
}
for (i = x + 1; i < m; i++) {
if (map[y][i] == 1 && ((visited >> ie_id[y][i]) & 1)) break;
if (map[y][i]) ans += meow(y, i, visited);
}
for (i = y - 1; i >= 0; i--) {
if (map[i][x] == 1 && ((visited >> ie_id[i][x]) & 1)) break;
if (map[i][x]) ans += meow(i, x, visited);
}
for (i = y + 1; i < n; i++) {
if (map[i][x] == 1 && ((visited >> ie_id[i][x]) & 1)) break;
if (map[i][x]) ans += meow(i, x, visited);
}
if (pmemo != NULL) *pmemo = ~ans;
return ans;
}
int main(void) {
int i, j;
int ky = -1, kx = -1;
if (scanf("%d%d", &m, &n) != 2) return 1;
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++) {
if (scanf("%d", &map[i][j]) != 1) return 1;
if (map[i][j] == 1) {
ie_id[i][j] = ie_cnt++;
} else if (map[i][j] == 2) {
ky = i;
kx = j;
}
}
}
if (ky < 0) return 72;
printf("%d\n", meow(ky, kx, 0));
return 0;
}
Submission Info
| Submission Time | |
|---|---|
| Task | F - 方向音痴のトナカイ |
| User | mikecat |
| Language | C23 (GCC 14.2.0) |
| Score | 100 |
| Code Size | 1736 Byte |
| Status | AC |
| Exec Time | 4347 ms |
| Memory | 197916 KiB |
Judge Result
| Set Name | set01 | set02 | set03 | set04 | set05 | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Score / Max Score | 20 / 20 | 20 / 20 | 20 / 20 | 20 / 20 | 20 / 20 | ||||||||||
| Status |
|
|
|
|
|
| Set Name | Test Cases |
|---|---|
| set01 | data1 |
| set02 | data2 |
| set03 | data3 |
| set04 | data4 |
| set05 | data5 |
| Case Name | Status | Exec Time | Memory |
|---|---|---|---|
| data1 | AC | 1 ms | 1712 KiB |
| data2 | AC | 1 ms | 2652 KiB |
| data3 | AC | 1407 ms | 91656 KiB |
| data4 | AC | 1392 ms | 91768 KiB |
| data5 | AC | 4347 ms | 197916 KiB |