Ejemplo n.º 1
0
int solver(int *map, int x1, int y1, int x2, int y2, int *original_stones, int n)
{
	//dump(map, x1, y1, x2, y2, original_stones, n);

	// Prepare
	int i, j, k;
	stoneEncode(global_stones, original_stones, n);
	global_original_stones = original_stones;
	global_n = n;

	global_x1 = x1;
	global_y1 = y1;
	global_x2 = x2;
	global_y2 = y2;

	for (i=0; i<1024; i++) map[i] = (map[i] == 0) ? -1 : -2;

	// Search
	global_best.score = 1024;
	bestScore(&global_best, map);

	for (i=0; i<n; i++) {
		int8_t op[256];
		BlockDefineOperation(global_stones[i].list, op);

		int *base = &global_operation[i << 8];
		*base = 0;

		for (j=0; j<8; j++) {
			int8_t *pp = &op[j << 5];
			if (pp[0] == INT8_MAX) continue;
			int *p = &base[(*base) << 5];

			for (k=1; k<global_stones[i].len; k++) {
				p[k << 1] = pp[k << 1];
				p[(k << 1) + 1] = pp[(k << 1) + 1];
			}

			(*base)++;
		}
	}

	global_sumlen[n] = 0;
	for (i=(n-1); i>=0; i--) global_sumlen[i] = global_sumlen[i+1] + global_stones[i].len;

	// IKUZO----
	//int t = n / 8;

#pragma omp parallel for num_threads(4)
	for (i=0; i<4; i++) {
		int *p = &global_tmpmap[i << 10];
		memcpy(p, map, 4096);
		backTracking(i, p, global_best.score, 1);
	}

	return EXIT_FAILURE;
}
Ejemplo n.º 2
0
void putWrapper(Score *best, Stone *stones, int n, const int *map, int x1, int y1, int x2, int y2, int *original_stones)
{
	// Score
	int i;
	Stone sorted[256];
	static int counter = 0;

	switch(counter++) {
	case 0:
		for (i=0; i<n; i++) stones[i].score = ((double)(n - i) / (double)n);
		break;
	case 1:
		for (i=0; i<n; i++) stones[i].score = (((double)(n - i) / (double)n) * (double)stones[i].len) * 0.0625;
		break;
	case 2:
		for (i=0; i<n; i++) stones[i].score = ((double)(n - i) / (double)n) * -1;
		break;
	case 3:
		for (i=0; i<n; i++) stones[i].score = (((double)(n - i) / (double)n) * (double)stones[i].len) * -0.0625;
		break;
	default:
		srand((unsigned)time(NULL));
		for (i=0; i<n; i++) stones[i].score = rand();
	}

	memcpy(sorted, stones, sizeof(Stone) * 256);
	qsort(sorted, n, sizeof(Stone), sortByScore);

	// Put
	int tmpmap[1024];
	for (i=0; i<n; i++) {
		memcpy(tmpmap, map, sizeof(int) * 1024);
		putStone(sorted, sorted[i].id, n, tmpmap, x1, y1, x2, y2);
		if (bestScore(best, tmpmap)) {
			printf("Update best score: (%d, %d)\n", best->score, best->zk);
			sendMsg("S");
			sendAnswer(best->map, stones, original_stones, n);
			if (sendMsg("E") == EXIT_FAILURE) return;
		}
	}
}
Ejemplo n.º 3
0
 /**
 * \fn void lancerMenu()
 * \brief Menu
 *
 * \author Dzik Timothee
 *
 * \return 
 */  
void lancerMenu() {
    printf("%s\n", pseudo);
    int choix = 0;
    while (choix != 5) {
        printf("Que voulez vous faire ?\n 1- Voir mon profil\n 2- Mon score\n 3- Best Score ! \n4- Jouer !\n5- Quitter\n");
        scanf("%d", &choix); fflush(stdin);
        switch (choix) {
            case 1:
                myProfile(pseudo);
                break;
            case 2:
                score_joueur(pseudo);
                break;
            case 3:
                bestScore();
                break;
            case 4:
                jouer();
                break;
            default:
                break;
        }
    }
}