#include #include #include #include typedef struct { int x, y; } Point; typedef struct { int size; Point points[10000]; } VisitedSet; void visited_add(VisitedSet *v, int x, int y) { v->points[v->size].x = x; v->points[v->size].y = y; v->size++; } int visited_contains(VisitedSet *v, int x, int y) { for (int i = 0; i < v->size; i++) { if (v->points[i].x == x && v->points[i].y == y) { return 1; } } return 0; } long long count_walks(int x, int y, int steps_left, VisitedSet *visited) { if (steps_left == 0) { return 1; } long long count = 0; // Try all 4 directions: E, N, W, S int dx[] = {1, 0, -1, 0}; int dy[] = {0, 1, 0, -1}; for (int dir = 0; dir < 4; dir++) { int nx = x + dx[dir]; int ny = y + dy[dir]; if (!visited_contains(visited, nx, ny)) { visited_add(visited, nx, ny); count += count_walks(nx, ny, steps_left - 1, visited); visited->size--; } } return count; } int main(int argc, char *argv[]) { if (argc < 2) { fprintf(stderr, "Usage: %s [prefix]\n", argv[0]); return 1; } int length = atoi(argv[1]); const char *prefix = argc > 2 ? argv[2] : ""; // Initialize visited set with origin VisitedSet visited; visited.size = 0; visited_add(&visited, 0, 0); // Process prefix int x = 0, y = 0; int dx[] = {1, 0, -1, 0}; // E, N, W, S int dy[] = {0, 1, 0, -1}; for (int i = 0; prefix[i]; i++) { char step = prefix[i]; int dir; if (step == 'E') dir = 0; else if (step == 'N') dir = 1; else if (step == 'W') dir = 2; else if (step == 'S') dir = 3; else { fprintf(stderr, "Invalid step: %c\n", step); return 1; } x += dx[dir]; y += dy[dir]; visited_add(&visited, x, y); } int remaining = length - strlen(prefix); long long result = count_walks(x, y, remaining, &visited); printf("%lld\n", result); return 0; }