Пример #1
0
void update_explored(location dest) {
	if(cartoon_happening) return;
	location shortdest,look;
	
	location look2;
	
	shortdest.x = (short) dest.x;
	shortdest.y = (short) dest.y;
	
	which_party_sec.x = univ.party.outdoor_corner.x + univ.party.i_w_c.x;
	which_party_sec.y = univ.party.outdoor_corner.y + univ.party.i_w_c.y;
	
	if(overall_mode == MODE_OUTDOORS) {
		univ.out.out_e[dest.x][dest.y] = 2;
		for(look.x = shortdest.x - 4; look.x < shortdest.x + 5; look.x++)
			for(look.y = shortdest.y - 4; look.y < shortdest.y + 5; look.y++) {
				// TODO: Windows had an extra check, is this needed?
				//if((look.x == minmax(0,95,(int)look.x)) && (look.y == minmax(0,95,(int)look.y))) {
				if(univ.out.out_e[look.x][look.y] == 0)
					if(can_see_light(shortdest, look, sight_obscurity) < 5)
						univ.out.out_e[look.x][look.y] = 1;
				//}
			}
		
		
	}
	
	if(overall_mode > MODE_OUTDOORS) {
		make_explored(dest.x,dest.y);
		for(look2.x = max(0,dest.x - 4); look2.x < min(univ.town->max_dim(),dest.x + 5); look2.x++)
			for(look2.y = max(0,dest.y - 4); look2.y < min(univ.town->max_dim(),dest.y + 5); look2.y++)
				if(!is_explored(look2.x,look2.y))
					if((can_see_light(dest, look2,sight_obscurity) < 5) && (pt_in_light(dest,look2)))
						make_explored(look2.x,look2.y);
	}
}
Пример #2
0
int main() {
  /* Deschidem un fisier si citim din el configuratia initiala si finala. */
  std::ifstream in("src-lab11/Puzzle.in");

  /* Dimensiunea puzzel-ului este setata global, per clasa. */
  in >> Node::N;
  Node* initial_node = new Node();
  Node* solution_node = new Node();
  in >> *initial_node >> *solution_node;

  std::cout << *initial_node << std::endl;
  std::cout << *solution_node << std::endl;

  /* Pentru nodurile in curs de explorare, implementate ca o coada de
   * prioritati. */
  std::priority_queue<Node*, std::vector<Node*>, NodeComparator> open(
      NodeComparator(NodeComparator::AStarOptimized, solution_node));

  /* Initial doar nodul de start este in curs de explorare. */
  initial_node->set_distance(0);
  initial_node->set_parent(NULL);
  open.push(initial_node);

  /* Pentru nodurile care au fost deja expandate. */
  std::vector<Node*> closed;

  do {
    if (open.empty()) {
      std::cout << "Nu a fost gasita nicio solutie." << std::endl;
      break;
    }

    Node* next = open.top(); 
    open.pop();

    if (next->has_same_state(*solution_node)) {
      std::cout << "A fost gasita solutia:" << std::endl;
      next->print_path();
      delete next;
      break;
    }

    /* Se exploreaza doar nodurile care nu au fost explorate deja. */
    if (!is_explored(closed, *next)) {
      /* Explorarea nodului este finalizata. */
      closed.push_back(next);

      /* Lista vecinilor. */
      std::vector<Node*> expand_next;
      next->expand(expand_next);
      for (std::vector<Node*>::iterator it = expand_next.begin();
           it != expand_next.end();
           ++it) {
        open.push(*it);
      }
    } else {
      delete next;
    }
  } while (true);

  /* Eliberare memoria folosită de noduri. */
  while (!open.empty()) {
    delete open.top();
    open.pop();
  }

  for (std::vector<Node*>::iterator it = closed.begin(); it != closed.end();
       ++it) {
    delete *it;
  }

  delete solution_node;

  return 0;
}
Пример #3
0
void nextMove(int x, int y, int pacman_x, int pacman_y, int food_x, int food_y, char grid[x][y]){
    int explored[1000][2] = {0};
    explored[0][0] = pacman_x;
    explored[0][1] = pacman_y;
    int explored_size = 1; 

    int path[1000][2] = {0};
    path[0][0] = pacman_x;
    path[0][1] = pacman_y; 
    int path_size = 1;

    // 2 - log the path pointer
    int stack[100][3] = {0};
    int stack_size = 0;

    int current_x = pacman_x;
    int current_y = pacman_y;
    do{
        // case UP
        if (current_x - 1 >= 0){
            if ((!is_explored(current_x - 1, current_y, explored, explored_size)) && grid[current_x - 1][current_y] != '%'){
                stack[stack_size][0] = current_x - 1;
                stack[stack_size][1] = current_y;
                stack[stack_size][2] = path_size;
                stack_size++;
            }
        }
        // case LEFT
        if (current_y - 1 >= 0){
            if ((!is_explored(current_x, current_y - 1, explored, explored_size)) && grid[current_x][current_y - 1] != '%'){
                stack[stack_size][0] = current_x;
                stack[stack_size][1] = current_y - 1;
                stack[stack_size][2] = path_size;
                stack_size++;
            }
        }
        
        // case RIGHT
        if (current_y + 1 < y){
            if ((!is_explored(current_x, current_y + 1, explored, explored_size)) && grid[current_x][current_y + 1] != '%'){
                stack[stack_size][0] = current_x;
                stack[stack_size][1] = current_y + 1;
                stack[stack_size][2] = path_size;
                stack_size++;
            }
        }
        // case DOWN
        if (current_x + 1 < x){
            if ((!is_explored(current_x + 1, current_y, explored, explored_size)) && grid[current_x + 1][current_y] != '%'){
                stack[stack_size][0] = current_x + 1;
                stack[stack_size][1] = current_y;
                stack[stack_size][2] = path_size;
                stack_size++;
            }
        }

        while (is_explored(stack[stack_size - 1][0], stack[stack_size - 1][1], explored, explored_size))
            stack_size--;
        path_size = stack[stack_size - 1][2];
        path[path_size][0] = stack[stack_size - 1][0];
        path[path_size][1] = stack[stack_size - 1][1];
        explored[explored_size][0] = path[path_size][0];
        explored[explored_size][1] = path[path_size][1];
        explored_size++;
        path_size++;
        stack_size--;

        current_x = path[path_size - 1][0];
        current_y = path[path_size - 1][1];
    } while (current_x != food_x || current_y != food_y);
    
    printf("%d\n", explored_size);
    for (int i = 0; i < explored_size; ++i)
        printf("%d %d\n", explored[i][0], explored[i][1]);

    printf("%d\n", path_size - 1);
    for (int i = 0; i < path_size; ++i)
        printf("%d %d\n", path[i][0], path[i][1]);
}