N-Queens Puzzle

This is my solution to the famous 8-Queens Puzzle (and more general N-Queens Puzzle). “So, what’s the 8-Queens Puzzle?” you say. “Good question!” I say. Wikipedia has a ton of information about this and summarizes as follows:

“The eight queens puzzle is the problem of placing eight chess queens on an 8×8 chessboard so that no two queens attack each other. Thus, a solution requires that no two queens share the same row, column, or diagonal. The eight queens puzzle is an example of the more general n-queens problem of placing n queens on an n×n chessboard, where solutions exist for all natural numbers n with the exception of 2 and 3″

In the program below, solutions are outputted to the text file in the following form:

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

Solution#1 to the 8-Queen Puzzle:

|---|---|---|---|---|---|---|---|

|Q||||||||

|---|---|---|---|---|---|---|---|

|||||||Q||

|---|---|---|---|---|---|---|---|

|||||Q||||

|---|---|---|---|---|---|---|---|

||||||||Q|

|---|---|---|---|---|---|---|---|

||Q|||||||

|---|---|---|---|---|---|---|---|

||||Q|||||

|---|---|---|---|---|---|---|---|

||||||Q|||

|---|---|---|---|---|---|---|---|

|||Q||||||

|---|---|---|---|---|---|---|---|

Solution#2 to the 8-Queen Puzzle:

|---|---|---|---|---|---|---|---|

|Q||||||||

|---|---|---|---|---|---|---|---|

|||||||Q||

|---|---|---|---|---|---|---|---|

||||Q|||||

|---|---|---|---|---|---|---|---|

||||||Q|||

|---|---|---|---|---|---|---|---|

||||||||Q|

|---|---|---|---|---|---|---|---|

||Q|||||||

|---|---|---|---|---|---|---|---|

|||||Q||||

|---|---|---|---|---|---|---|---|

|||Q||||||

|---|---|---|---|---|---|---|---|

...and so on...

For the 8-Queen Puzzle, the program will export all 92 solutions to the “8-Queen.txt” file almost instantaneously. The file itself will occupy 56kb (58,503 bytes) of disk space. For the 14-Queen Puzzle, all solutions are exported in roughly 3 minutes. That’s pretty quick considering that there are 365,596 distinct solutions and the file size required to represent them is a whopping 612mb (642,241,067 bytes)!

Initially, my solution relied on recursion and was similar to others you may find online. Recursive approaches to this problem are intuitive, but they tend to be slow and will result in stack overflow errors when N is large. For these reasons my current algorithm avoids recursion altogether. The C++ code is heavily commented but if you need clarification about how it works, feel free to leave me a comment below.

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

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

// N-QUEEN PUZZLE SOLUTIONS WITHOUT RECURSION

// by John Hutchinson

// Aug. 10, 2012

#include <iostream> // For cin / cout

#include <vector> // Using a vector as a stack (they are easier to iterate)

// These three used for file output

#include <fstream> // For file output stream

#include <string> // used for constructing the filename

#include <sstream> // used to convert n to a string (as part of the filename)

usingnamespacestd;

/*

Upper limit of N = 14 because the output for all solutions when N > 14