예제 #1
0
파일: T_Map.cpp 프로젝트: TangLin12/OJ_task
void T_Map::Intersect(T_Spirit* spirit) {
	int col = spirit->_pos.x / PIXEL;
	int row = spirit->_pos.y / PIXEL;
	CvRect player = { spirit->_pos.x,spirit->_pos.y,spirit->_width,spirit->_height };
	CvRect relate_wall = { col*PIXEL,(row + 1)*PIXEL,PIXEL,PIXEL };
	CvRect relate_wall_1 = { (col + 1)*PIXEL,row*PIXEL,PIXEL,PIXEL };
	CvRect relate_wall_2 = { (col + 1)*PIXEL,(row + 1)*PIXEL,PIXEL,PIXEL };
	
	if (CantMove(col, row) ||
		(CantMove(col, row + 1) && T_Tool::Intersect(player, relate_wall))||
		(CantMove(col + 1, row) && T_Tool::Intersect(player, relate_wall_1)) ||
		(CantMove(col + 1, row + 1) && T_Tool::Intersect(player, relate_wall_2))) {
		spirit->_pos = spirit->_prePos;
	}


}
예제 #2
0
bool Solve(SceneSize scene_size, int scene[][scene_size.height],
    Action actions[], int index, size_t len) {
  if (IsFinished(scene_size, scene)) return true;
  if (index == len) return false;

  int (*new_scene)[scene_size.height];

  for (int x = 0; x < scene_size.width; x++) {
    for (int y = 0; y < scene_size.height; y++) {
      if (scene[x][y] == 0) {
        break;
      }
      for (Direction foward = EAST;
           foward < DirectionButtom;
           foward++) {
        if (CantMove(x, y, foward, scene_size)) {
          continue;
        }
        new_scene = (int (*)[scene_size.height])malloc(
              sizeof(int) * scene_size.height * scene_size.width);
        if (new_scene == NULL) {
          printf("new_scene == NULL\n");
          abort();
        }
        memcpy(new_scene, scene, scene_size.width * scene_size.height * sizeof(int));
        actions[index].x = x;
        actions[index].y = y;
        actions[index].foward = foward;
        Move(scene_size, new_scene, actions[index]);
        if (Solve(scene_size, new_scene, actions, index+1, len)) {
          free(new_scene);
          return true;
        }
        free(new_scene);
      }
    }
  }
  return false;
}