Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
为什么老是TLE啊,感觉好像死循环了,但是一直都找不出来哪里有错#include <stdio.h> #include <stdlib.h> #include <string.h> /* Sample Input 2 8 8 ######## #......# #.####.# #.####.# #.####.# #.####.# #...#..# #S#E#### 9 5 ######### #.#.#.#.# S.......E #.#.#.#.# ######### Sample Output 37 5 5 17 17 9 */ #define QSIZE 2000 char nodes[1600]; int visit_table[1600]; int queue[QSIZE]; int head = 0; int rear = 0; int dequeue() { return queue[head++ % QSIZE]; } void enqueue(int value) { queue[rear++ % QSIZE] = value; } int empty() { return rear == head; } int main() { // char *maze = "##########.#.#.#.#S.......E#.#.#.#.##########"; int case_num; int w, h, i; int total; int start; int step = 1; int curr_rear; int curr_pos; //0:left 1:up 2:right 3:down // l:(direction+delta)%4 // r:(direction-delta+6)%4 int direction[] = { 0, -1, -0, 1 }; // l:(direction+delta)%4 // r:(direction-delta+6)%4 int new_direction[] = { 3, 0, 1, 2 }; int curr_d = 0, start_d; scanf("%d", &case_num); // case_num = 1; while (case_num--) { scanf("%d %d", &w, &h); // w = 9; // h = 5; total = w * h; direction[0] = w; direction[2] = -w; for (i = 0; i < total; i++) { nodes[i] = getchar(); if (nodes[i] == '\n') nodes[i] = getchar(); // nodes[i] = maze[i]; if (nodes[i] == 'S') { start = i; enqueue(i); } } if (start < w) start_d = 3; else if (start > total - w) start_d = 1; else if (start % w == 0) start_d = 2; else start_d = 0; //left curr_pos = start; curr_d = start_d; while (nodes[curr_pos] != 'E') { int tmp, delta; // printf("%d,",curr_pos); delta = direction[curr_d % 4]; tmp = curr_pos + delta; if (nodes[tmp] != '#') { curr_pos = tmp; curr_d = new_direction[curr_d % 4]; step++; continue; } delta = direction[(curr_d + 1) % 4]; tmp = curr_pos + delta; if (nodes[tmp] != '#') { curr_pos = tmp; curr_d = new_direction[(curr_d + 1) % 4]; step++; continue; } delta = direction[(curr_d + 2) % 4]; tmp = curr_pos + delta; if (nodes[tmp] != '#') { curr_pos = tmp; curr_d = new_direction[(curr_d + 2) % 4]; step++; continue; } delta = direction[(curr_d + 3) % 4]; tmp = curr_pos + delta; if (nodes[tmp] != '#') { curr_pos = tmp; curr_d = new_direction[(curr_d + 3) % 4]; step++; continue; } } printf("%d ", step); step = 1; //right curr_d = start_d; curr_pos = start; while (nodes[curr_pos] != 'E') { int tmp, delta; delta = direction[(curr_d + 6) % 4]; tmp = curr_pos + delta; if (nodes[tmp] != '#') { curr_pos = tmp; curr_d = new_direction[(curr_d + 6) % 4]; step++; continue; } delta = direction[(curr_d + 5) % 4]; tmp = curr_pos + delta; if (nodes[tmp] != '#') { curr_pos = tmp; curr_d = new_direction[(curr_d + 5) % 4]; step++; continue; } delta = direction[(curr_d + 4) % 4]; tmp = curr_pos + delta; if (nodes[tmp] != '#') { curr_pos = tmp; curr_d = new_direction[(curr_d + 4) % 4]; step++; continue; } delta = direction[(curr_d + 3) % 4]; tmp = curr_pos + delta; if (nodes[tmp] != '#') { curr_pos = tmp; curr_d = new_direction[(curr_d + 3) % 4]; step++; continue; } } printf("%d ", step); step = 1; //min memset(visit_table, 0, 1600); visit_table[start] = 1; while (1) { curr_rear = rear; while (head != curr_rear) { int value = dequeue(); // printf("%d\n",value); if (nodes[value] == 'E') goto done; if ((value - w >= 0) && nodes[value - w] != '#' && !visit_table[value - w]) { enqueue(value - w); visit_table[value - w] = 1; } if ((value + w) < total && nodes[value + w] != '#' && !visit_table[value + w]) { enqueue(value + w); visit_table[value + w] = 1; } if (nodes[value - 1] != '#' && !visit_table[value - 1]) { enqueue(value - 1); visit_table[value - 1] = 1; } if (nodes[value + 1] != '#' && !visit_table[value + 1]) { enqueue(value + 1); visit_table[value + 1] = 1; } } step++; } done: printf("%d\n", step); head = rear = 0; step = 1; } exit(0); } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator