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)];
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
#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
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
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


2026-03-17 (Tue)
07:56:04 +09:00