Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Latest commit

 

History

History
History
116 lines (105 loc) · 3.19 KB

File metadata and controls

116 lines (105 loc) · 3.19 KB
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/**
* @file
* @brief [Knight's tour](https://en.wikipedia.org/wiki/Knight%27s_tour)
* algorithm
*
* @details
* A knight's tour is a sequence of moves of a knight on a chessboard
* such that the knight visits every square only once. If the knight
* ends on a square that is one knight's move from the beginning
* square (so that it could tour the board again immediately, following
* the same path, the tour is closed; otherwise, it is open.
*
* @author [Nikhil Arora](https://github.com/nikhilarora068)
* @author [David Leal](https://github.com/Panquesito7)
*/
#include <array> /// for std::array
#include <iostream> /// for IO operations
/**
* @namespace backtracking
* @brief Backtracking algorithms
*/
namespace backtracking {
/**
* @namespace knight_tour
* @brief Functions for the [Knight's
* tour](https://en.wikipedia.org/wiki/Knight%27s_tour) algorithm
*/
namespace knight_tour {
/**
* A utility function to check if i,j are valid indexes for N*N chessboard
* @tparam V number of vertices in array
* @param x current index in rows
* @param y current index in columns
* @param sol matrix where numbers are saved
* @returns `true` if ....
* @returns `false` if ....
*/
template <size_t V>
bool issafe(int x, int y, const std::array<std::array<int, V>, V> &sol) {
return (x < V && x >= 0 && y < V && y >= 0 && sol[x][y] == -1);
}
/**
* Knight's tour algorithm
* @tparam V number of vertices in array
* @param x current index in rows
* @param y current index in columns
* @param mov movement to be done
* @param sol matrix where numbers are saved
* @param xmov next move of knight (x coordinate)
* @param ymov next move of knight (y coordinate)
* @returns `true` if solution exists
* @returns `false` if solution does not exist
*/
template <size_t V>
bool solve(int x, int y, int mov, std::array<std::array<int, V>, V> &sol,
const std::array<int, V> &xmov, std::array<int, V> &ymov) {
int k = 0, xnext = 0, ynext = 0;
if (mov == V * V) {
return true;
}
for (k = 0; k < V; k++) {
xnext = x + xmov[k];
ynext = y + ymov[k];
if (issafe<V>(xnext, ynext, sol)) {
sol[xnext][ynext] = mov;
if (solve<V>(xnext, ynext, mov + 1, sol, xmov, ymov) == true) {
return true;
} else {
sol[xnext][ynext] = -1;
}
}
}
return false;
}
} // namespace knight_tour
} // namespace backtracking
/**
* @brief Main function
* @returns 0 on exit
*/
int main() {
const int n = 8;
std::array<std::array<int, n>, n> sol = {0};
int i = 0, j = 0;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
sol[i][j] = -1;
}
}
std::array<int, n> xmov = {2, 1, -1, -2, -2, -1, 1, 2};
std::array<int, n> ymov = {1, 2, 2, 1, -1, -2, -2, -1};
sol[0][0] = 0;
bool flag = backtracking::knight_tour::solve<n>(0, 0, 1, sol, xmov, ymov);
if (flag == false) {
std::cout << "Error: Solution does not exist\n";
} else {
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
std::cout << sol[i][j] << " ";
}
std::cout << "\n";
}
}
return 0;
}
Morty Proxy This is a proxified and sanitized view of the page, visit original site.