56 std::set<int> m_bEgress;
60 m_bEgress.insert(target + delta.second*w + delta.first);
64 int preferredcount = 0;
76 int next = current + delta.second*w + delta.first;
78 available[count++] = next;
89 for(
int i=0; i<count; i++){
92 if(exitcount[i] < min)
100 for(
int i=0; i<count; i++)
101 if(exitcount[i] <= min && b[available[i]] != current)
102 preferred[prefcount++] = available[i];
112 next = preferred[index];
113 }
while(next == target && prefcount > 1);
122 m_bEgress.erase(current);
123 }
while(count > 0 && m_bEgress.size() > 0 && !
g_bFinished);
141 bool bCycleCover =
false;
145 for(
int i=0; i<4*w && !bCycleCover; i++){
146 bool bFinished =
false;
150 while(b[first] !=
UNUSED && first < n)
153 bCycleCover = first >= n;
154 bFinished = bCycleCover;
161 b[first] != last && b[last] != first;
196 int nNextMoveCount = 1;
202 while(nNumTrials < 4*w && (!b.
IsKnightMove(current, start) || nVisited < 6)){
210 int next = current + delta.second*w + delta.first;
212 available[nNextMoveCount++] = next;
221 for(
int i=0; i<nNextMoveCount; i++){
223 if(exitcount[i] < min)
231 int preferredcount = 0;
234 for(
int i=0; i<nNextMoveCount; i++){
235 if(exitcount[i] <= min && b[available[i]] != current)
236 preferred[preferredcount++] = available[i];
241 if(preferredcount > 0){
242 if(preferredcount == 1)
267 case CycleType::Tour:
271 case CycleType::Tourney:
275 case CycleType::TourFromTourney:
int RandomClosedWalk(CBoard &b, int start)
Create closed random walk.
Header for Warnsdorff's generator CWarnsdorff.
Defines, enumerated types, and typedefs.
bool DeleteMove(int src, int dest)
Delete a move.
void Generate(CBoard &b, CycleType t)
Generate a tour or tourney.
UINT randn()
Get a random unsigned integer.
std::pair< int, int > MoveDelta
Move delta for a knight's move.
CWarnsdorff(int seed)
Constructor.
bool IsKnightMove(int i, int j)
Knight's move test.
bool IsOnBoard(int pos, const MoveDelta &delta)
Move stays on board.
void JoinUntilTour()
Join cycles to reduce tourney size.
std::atomic_bool g_bFinished
Search termination flag.
bool GenerateTourney(CBoard &b)
Generate a tourney.
#define UNUSED
Contents of unused square on the chessboard.
int GetAvailableMoveCount(int index)
Get number of moves from a cell.
void srand()
Seed the random number generator.
std::vector< MoveDelta > MoveDeltas
Move deltas for knight's moves.
bool GenerateTour(CBoard &b)
Generate a knight's tour.
MoveDeltas g_vecDeltas
Move deltas for all possible knight's moves.
bool InsertUndirectedMove(int src, int dest)
Insert an undirected move.
void Clear()
Clear the board of moves.