void solve() { scanf("%d", &n); vvi closest; closest.assign(n, vi(4, -1)); forn(i, n) { a[i].read(); } for (int i = 0; i < n; ++i) { for (int j = i + 1; j < n; ++j) { int u = i, v = j; if (a[u].x == a[v].x) { if (a[u].y > a[v].y) swap(u, v); upd(u, closest[u][to_dir('v')], v); upd(v, closest[v][to_dir('^')], u); } else if (a[u].y == a[v].y) { if (a[u].x > a[v].x) swap(u, v); upd(u, closest[u][to_dir('>')], v); upd(v, closest[v][to_dir('<')], u); } } } int ans = doit(closest, 0); for (int i = 1; i < n; ++i) { ans = max(ans, doit(closest, i)); } cout << ans << endl; }
void gameloop(int nrow, int ncol) { timeout(1000 / SAMPLING_RATE); const clock_t checkpoint = (clock_t) (CLOCKS_PER_SEC/GAME_SPEED); clock_t last_update = clock(); struct snake * snake = new_snake(ncol/2, nrow/2); struct point food_pos = generate_food(nrow, ncol, snake); redraw(snake, food_pos); for (;;) { struct point tail_pos = snake->tail->pos; int ch; if ((ch = getch()) != ERR) { switch (ch) { case KEY_UP: case KEY_DOWN: case KEY_LEFT: case KEY_RIGHT: if (to_dir(ch) == reverse_dir(snake->heading)) { break; } else { snake->heading = to_dir(ch); step_snake(snake); tail_pos = snake->tail->pos; redraw(snake, food_pos); } break; default: break; } } if (clock() - last_update >= checkpoint) { step_snake(snake); tail_pos = snake->tail->pos; redraw(snake, food_pos); last_update = clock(); } if (point_equal(snake->head->pos, food_pos)) { grow_snake(snake, tail_pos); food_pos = generate_food(nrow, ncol, snake); redraw(snake, food_pos); } if (out_of_border(snake->head->pos, nrow, ncol) || eat_self(snake)) { display_lose(nrow, ncol); return; } if (snake->length == (nrow-2)*(ncol-2)) { display_win(nrow, ncol); return; } } }
u_char getcourse(int x, int y) { return to_dir(me->p_x, me->p_y, x, y); }
int doit(vvi closest, int pos) { int ans = 0; while (pos != -1) { ans++; int npos = closest[pos][to_dir(a[pos].dir)]; int d1 = closest[pos][to_dir('^')]; if (d1 != -1) closest[d1][to_dir('v')] = closest[pos][to_dir('v')]; int d2 = closest[pos][to_dir('v')]; if (d2 != -1) closest[d2][to_dir('^')] = closest[pos][to_dir('^')]; int d3 = closest[pos][to_dir('>')]; if (d3 != -1) closest[d3][to_dir('<')] = closest[pos][to_dir('<')]; int d4 = closest[pos][to_dir('<')]; if (d4 != -1) closest[d4][to_dir('>')] = closest[pos][to_dir('>')]; pos = npos; } return ans; }