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; }
/* * 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; }