コード例 #1
0
ファイル: 3-nqueens.c プロジェクト: rbonvall/taller
/* retorna TRUE cuando encuentra una solucion valida */
int backtrack(int a[], int n, int k) {
    if (n == k) {
        if (is_valid_solution(a, n)) {
            print_solution(a, n);
            return TRUE;
        }
        else
            return FALSE;
    }
    else {
        int nr_candidates;
        int candidates[N];
        find_candidates(a, n, k, candidates, &nr_candidates);
        int found;

        int i;
        for (i = 0; i < nr_candidates; ++i) {
            a[k] = candidates[i];
            found = backtrack(a, n, k + 1);
            if (found)
                return TRUE;
        }
        return FALSE;
    }
}
コード例 #2
0
ファイル: prime.c プロジェクト: pbos/optimus
void sieve_factor(mpz_t num)
{
	mpz_t gmp_root;
	mpz_init(gmp_root);
	mpz_sqrt(gmp_root, num);

	if(mpz_root(gmp_root, num, 2) != 0)
	{
		mpz_set(factors[num_factors++], gmp_root);
		mpz_set(factors[num_factors++], gmp_root);
		mpz_clear(gmp_root);
		return;
	}

	fail = true;

	find_candidates(num, gmp_root);

	mpz_clear(gmp_root);
}
コード例 #3
0
ファイル: SnowModel.cpp プロジェクト: nobbk/copo
/**
 * Generates edge groups over the mesh.
 */
void SnowModel::generateEdgeGroups()
{
    std::cout << "[Snow Model] Generating edge groups" << std::endl;
    std::vector< std::set<Mesh::face*>* > candidate_meshes;

    ::Utilities::Timer t;

    t.start();

    /* clear the current edge group container */
    RemoveEdgeGroups();

    /* go through every mesh */
    #pragma omp parallel for
    for (unsigned int i=0; i < m_meshPool->getNrMeshs(); ++i) {

        /* copy the whole mesh to work on it */
        Mesh* tmpMesh = m_meshPool->getMesh(i);
        Mesh::face* f = tmpMesh->mesh()->face_source;

        candidate_meshes.clear();

        /* init all marks to false */
        do {
            f->marked = false;
            f = f->next_face;
        } while (f != NULL);


        std::cout << "\t*Growing edge groups...";
        std::flush(std::cout);

        int percent_step = static_cast<int>(tmpMesh->mesh()->number_faces * 0.1f);
        int step = 10;

        if (percent_step < 1)
        {
            step = static_cast<int>(100.0f / tmpMesh->mesh()->number_faces);
            percent_step = 1;
        }
        unsigned int percent_count = 0;
        int percent = 0;
        int face_count = 0;

        /* go through all faces */
        f = tmpMesh->mesh()->face_source;
        unsigned int eg_count = 0;
        do {

            if (face_count > percent_count)
            {
                std::cout << " " << percent;
                std::flush(std::cout);
                percent_count += percent_step;
                percent += step;
            }

            /*	get only those faces that could potentially get
             *	covered with snow (slope angle < 90� and facing outside) */
            if (!f->marked) {
                if (f->slope_angle < ( PI_2 - NearlyZero) )
                {
                    ++eg_count;
                    std::set<Mesh::face*> * candidate_mesh = new std::set<Mesh::face*>();
                    candidate_meshes.push_back(candidate_mesh);

                    /* find the candidate faces that are reachable
                     * from the current face */
                    find_candidates(f, candidate_mesh, tmpMesh);

                    face_count += candidate_mesh->size();
                } else {
                    ++face_count;
                }
            }

            f = f->next_face;
        } while (f != NULL);

        std::cout << " ...ready" << std::endl << "\t*Initializating " << candidate_meshes.size() << " edge groups...";
        std::flush(std::cout);

        percent_step = static_cast<int>(candidate_meshes.size() * 0.1f);
        step = 10;

        if (percent_step < 1)
        {
            step = static_cast<int>(100.0f / candidate_meshes.size());
            percent_step = 1;
        }
        percent_count = 0;
        percent = 0;

        for (unsigned int i = 0; i < candidate_meshes.size(); ++i) {
            try {
                //std::cout << "\tFound new edge group (#" << (i + 1) << ")" << std::endl;
                // TODO: go through the found candidates and see if they overlap in Y-Order (top)
                EdgeGroup* eg = new EdgeGroup(m_world, candidate_meshes[i], m_iLaunchSiteOptimizations);
                if ( m_rememberColors && i < m_vecRememberedColors.size() ) {
                    eg->SetEdgeGroupFaceColor(m_vecRememberedColors[i]);
                }
                edge_groups.push_back(eg);

                if (i == percent_count)
                {
                    std::cout << " " << percent;
                    std::flush(std::cout);
                    percent_count += percent_step;
                    percent += step;
                }
            } catch (exception &e) {
                std::cerr << "[Error] Error within the creation of EdgeGroup " << i + 1 << ": " << e.what() << std::endl;
            }
        }

        std::cout << " ...ready" << std::endl;

        if (m_rememberColors) {
            save_colors();
        }
    }

    t.stop();
    std::cout << "\tTime: " << t.diffTimeInMSec() << "msec" << std::endl;
}
コード例 #4
0
ファイル: peak-tracking.c プロジェクト: bion/ats
/* peak_tracking
 * =============
 * connects peaks from one analysis frame to tracks
 * returns a pointer to two frames of orphaned peaks.
 * tracks: pointer to the tracks
 * tracks_size: numeber of tracks
 * peaks: peaks to connect
 * peaks_size: number of peaks
 * frq_dev: frequency deviation from tracks
 * SMR_cont: contribution of SMR to tracking
 * n_partials: pointer to the number of partials before tracking
 */
ATS_FRAME *peak_tracking(ATS_PEAK *tracks, int *tracks_size, ATS_PEAK *peaks, int *peaks_size, float frq_dev, float SMR_cont, int *n_partials)
{
  ATS_CANDS *track_candidates = (ATS_CANDS *)malloc(*peaks_size*sizeof(ATS_CANDS));
  double lo, hi;
  int k, j, used, goback;
  ATS_FRAME *returned_peaks = (ATS_FRAME *)malloc(2*sizeof(ATS_FRAME));

  returned_peaks[0].peaks = returned_peaks[1].peaks = NULL;
  returned_peaks[0].n_peaks = returned_peaks[1].n_peaks = 0;

  /* sort data to prepare for matching */
  qsort(tracks, *tracks_size, sizeof(ATS_PEAK), peak_frq_inc);
  qsort(peaks, *peaks_size, sizeof(ATS_PEAK), peak_frq_inc);

  /* find candidates for each peak and set each peak to best candidate */
  for (k=0; k<*peaks_size; k++) {
    /* find frq limits for candidates */
    lo = peaks[k].frq - (.5 * peaks[k].frq * frq_dev);
    hi = peaks[k].frq + (.5 * peaks[k].frq * frq_dev);
    /* get possible candidates */
    track_candidates[k].size = 0;
    track_candidates[k].cands = find_candidates(tracks, *tracks_size, lo, hi, &track_candidates[k].size);
    if(track_candidates[k].size) {
      sort_candidates(&track_candidates[k], peaks[k], SMR_cont);
      peaks[k].track = track_candidates[k].cands[0].track;
    } 
  }      

  /* compare adjacent peaks track numbers to insure unique track numbers */
  do {
    goback = 0;
    for (j=0; j<(*peaks_size - 1); j++) 
      if((peaks[j].track == peaks[j+1].track) && (peaks[j].track > -1)) {
        if(track_candidates[j].cands[0].amp > track_candidates[j+1].cands[0].amp) {
          track_candidates[j].cands[0].amp = ATSA_HFREQ;
          qsort(track_candidates[j].cands, track_candidates[j].size, sizeof(ATS_PEAK), peak_amp_inc);
          if(track_candidates[j].cands[0].amp < ATSA_HFREQ) {
            peaks[j].track = track_candidates[j].cands[0].track;
            goback = 1;
          } else peaks[j].track = -1;
        } else {
          track_candidates[j+1].cands[0].amp =  ATSA_HFREQ;
          qsort(track_candidates[j+1].cands, track_candidates[j+1].size, sizeof(ATS_PEAK), peak_amp_inc);
          if(track_candidates[j+1].cands[0].amp < ATSA_HFREQ)
            peaks[j+1].track = track_candidates[j+1].cands[0].track;
          else peaks[j+1].track = -1;
        }
      }
  } while (goback);

  /* by this point, all peaks will either have a unique track number, or -1 
     now we need to take care of those left behind */
  for(k=0; k<*peaks_size; k++)
    if(peaks[k].track == -1) {
      peaks[k].track = (*n_partials)++;
      returned_peaks[1].peaks = push_peak(&peaks[k], returned_peaks[1].peaks, &returned_peaks[1].n_peaks);
    }

  /* check for tracks that didnt get assigned */
  for(k=0; k<*tracks_size; k++) {
    used = 0;
    for(j=0; j<*peaks_size; j++)
      if(tracks[k].track == peaks[j].track) {
        used = 1;
        break;
      }
    if(!used) returned_peaks[0].peaks = push_peak(&tracks[k], returned_peaks[0].peaks, &returned_peaks[0].n_peaks);
  }

  for (k=0; k<*peaks_size; k++) free(track_candidates[k].cands);
  free(track_candidates);
  return(returned_peaks);
}