static int recv_client() { struct timeval tv; int ret; tv.tv_sec = 0; tv.tv_usec = 0; set_read(); set_write(); if ((ret = select(*(g_zappy->highest) + 1, &(g_zappy->read.fds), &(g_zappy->write.fds), NULL, &tv)) < 0) return (server_error(SELECT_ERR)); else if (ret == 0) return (0); return (get_actions()); }
int main(void) { int n, m; char **maze = read_maze(&n, &m); // initialization fringe *f = fringe_init(); fringe_enqueue(f, make_fringe_item(make_state(0, 0), NULL)); int **closed_set = init_closed_set(n, m); // set up search helper-variables fringe_item *current_item; state *current_state; action *current_strategy; state *next_state; int num_actions, i; int *available_actions; int strategy_found = 0; action *strategy; // perform breadth first search while (!is_empty(f)) { current_item = fringe_dequeue(f); current_state = current_item->state; current_strategy = current_item->strategy; // goal state-check if (is_goal_state(current_state, n, m)) { strategy = current_strategy; strategy_found = 1; break; } // only proceed if the node has not been visited if (is_in_closed_set(current_state, closed_set)) { // free item? continue; } // put the current node into the closed set insert_into_closed_set(current_state, closed_set); // expand current node available_actions = get_actions(current_state, maze, &num_actions); for (i = 0; i < num_actions; i++) { next_state = apply(current_state, available_actions[i]); // add this state/action-pair to the fringe action *new_action = make_action(available_actions[i], current_strategy); fringe_enqueue(f, make_fringe_item(next_state, new_action)); } free(current_item); } if (!strategy_found) { // don't do anything } else { display_and_free(reverse(strategy), make_state(0, 0)); printf("[%d, %d]\n", n - 1, m - 1); } // free maze memory return 0; }