//--------------------------------------------------------------------------- void __fastcall TFormSolvePuzzle::ButtonSolveClick(TObject *Sender) { const std::vector<PuzzlePiece> piecesOriginal = GetPieces(); std::vector<PuzzlePiece> pieces1d = piecesOriginal; std::sort(pieces1d.begin(),pieces1d.end()); ProgressBar->Max = IntPower(4,9); ProgressBar->Hint = ProgressBar->Max; const int maxI = IntPower(4,9); for (int i = 1; i!=maxI; ++i) { const std::vector<PuzzlePiece> solution = SolvePuzzle(std::vector<PuzzlePiece>(),pieces1d); if (solution.empty() == false) { ShowSolution(solution); ShowMessage("Solved!"); return; } Application->ProcessMessages(); if (mQuit == true) return; ProgressBar->Position = i; //Rotate a piece or more pieces for (int index = 0; index != 9; ++index) { pieces1d[index].Rotate(); if (pieces1d[index].mNrotations != 0) break; } } ShowMessage("Not solved..."); }
void HalfKP<AssociatedKing>::AppendActiveIndices( const Position& pos, Color perspective, IndexList* active) { // コンパイラの警告を回避するため、配列サイズが小さい場合は何もしない if (RawFeatures::kMaxActiveDimensions < kMaxActiveDimensions) return; BonaPiece* pieces; Square sq_target_k; GetPieces(pos, perspective, &pieces, &sq_target_k); for (PieceNumber i = PIECE_NUMBER_ZERO; i < PIECE_NUMBER_KING; ++i) { active->push_back(MakeIndex(sq_target_k, pieces[i])); } }
void HalfKP<AssociatedKing>::AppendChangedIndices( const Position& pos, Color perspective, IndexList* removed, IndexList* added) { BonaPiece* pieces; Square sq_target_k; GetPieces(pos, perspective, &pieces, &sq_target_k); const auto& dp = pos.state()->dirtyPiece; for (int i = 0; i < dp.dirty_num; ++i) { if (dp.pieceNo[i] >= PIECE_NUMBER_KING) continue; const auto old_p = static_cast<BonaPiece>( dp.changed_piece[i].old_piece.from[perspective]); removed->push_back(MakeIndex(sq_target_k, old_p)); const auto new_p = static_cast<BonaPiece>( dp.changed_piece[i].new_piece.from[perspective]); added->push_back(MakeIndex(sq_target_k, new_p)); } }