int put_queen_brute(int nb_queen, char board[8][8], int possibility, solution **s, options *op) {
  int posy = 0;
  int posx = 0;

  for (; posy < 8; ++posy) {
    for (posx = 0; posx < 8; ++posx) {
      if (!board[posy][posx]) {
	set_queen(nb_queen, board, posx, posy);
	if (nb_queen == 8) {
	  if (add_solution(board, s)) {
	    possibility += 1;
	    print_board(board, possibility, op);
	    if (possibility == 92 && op->stop_before_end)
	      op->end = 1;
	  }
	}
	else
	  possibility = put_queen_brute(nb_queen + 1, board, possibility, s, op);
	unset_queen(nb_queen, board);
	if (op->end)
	  return possibility;
      }
    }
  }
  return possibility;
}
Example #2
0
/*
 *  make the next solve move
 */
int solve_next_move()
{
	int moved = 0;
	int on; 

	// done - found solution
	if(queen == SOLVE_NQUEENS)
	{
		sprintf(move_buff[(move_count++)%MOVE_WRAP], "Complete!!!");
		return 1;
	} 
	// done - did not find solution
	if(queen < 0)
	{
		sprintf(move_buff[(move_count++)%MOVE_WRAP], "Failed.");
		return -1;
	}

	// should only run once or twice
	while(!moved)
	{
		on = queen_on(queen);
		moved = 1;
		// from last time
		if(on)
		{
			remove_queen(queen); 
		}
		// add to board
		else
		{
			stack[queen].di = rand()%SOLVE_SIZE;
			stack[queen].dj = rand()%SOLVE_SIZE;
			stack[queen].i = 0;
		}

		// find open spot
		do
		{
			// increment position
			++stack[queen].j;
			if(stack[queen].j == SOLVE_SIZE){
				stack[queen].j = 0;
				++stack[queen].i;

				// exhausted - backtrack
				if(stack[queen].i == SOLVE_SIZE)
				{
					stack[queen].i = stack[queen].j = -1;
					--queen;
					if(on){
						mn = 0;
						sprintf(move_buff[(move_count++)%MOVE_WRAP],
								"...Exhausted spaces for Queen %d.", queen+2);
						return 0;
					}
					mn = 1;
					sprintf(move_buff[(move_count++)%MOVE_WRAP],
							"...No place for Queen %d.", queen+2);

					moved = 0;
					break;
				}
			}
		} while(!solve_spot_open(Si(queen), Sj(queen)));
	}
	mn = 0;
	sprintf(move_buff[(move_count++)%MOVE_WRAP], 
			"Move Queen %d to %c%d.", queen+1, Si(queen)+'A', Sj(queen)+1);

	// place queen
	set_queen(queen);

	// get next queen
	++queen;

	return 0;
}