C++ Mathematical Expression Toolkit (ExprTk) release
Loading...
Searching...
No Matches
exprtk_nqueens_problem.cpp
Go to the documentation of this file.
1/*
2 **************************************************************
3 * C++ Mathematical Expression Toolkit Library *
4 * *
5 * ExprTk N-Queens Problem *
6 * Author: Arash Partow (1999-2024) *
7 * URL: https://www.partow.net/programming/exprtk/index.html *
8 * *
9 * Copyright notice: *
10 * Free use of the Mathematical Expression Toolkit Library is *
11 * permitted under the guidelines and in accordance with the *
12 * most current version of the MIT License. *
13 * https://www.opensource.org/licenses/MIT *
14 * SPDX-License-Identifier: MIT *
15 * *
16 **************************************************************
17*/
18
19
20#include <string>
21
22#include "exprtk.hpp"
23
24
25template <typename T>
27{
28 typedef exprtk::symbol_table<T> symbol_table_t;
29 typedef exprtk::expression<T> expression_t;
30 typedef exprtk::parser<T> parser_t;
31 typedef exprtk::function_compositor<T> compositor_t;
32 typedef typename compositor_t::function function_t;
33
34 const T n = T(15);
35 std::vector<T> board(static_cast<std::size_t>(n), T(- 1));
36
38
39 symbol_table_t symbol_table;
40 symbol_table.add_constant("n" , n );
41 symbol_table.add_vector ("board" , board);
42 symbol_table.add_package (io_package);
43
44 compositor_t compositor(symbol_table);
45
46 compositor.load_variables(true);
47 compositor.load_vectors (true);
48
49 compositor.add(
50 function_t("display_board")
51 .expression
52 (
53 " for (var row := 0; row < n; row += 1) "
54 " { "
55 " for (var col := 0; col < n; col += 1) "
56 " { "
57 " print((board[row] == col) ? ' Q ' : ' . '); "
58 " }; "
59 " "
60 " println(''); "
61 " } "
62 ));
63
64 compositor.add(
65 function_t("is_valid")
66 .vars("row", "col")
67 .expression
68 (
69 " for (var i := 0; i < row; i += 1) "
70 " { "
71 " if ( "
72 " (board[i] == col) or "
73 " (abs(board[i] - col) == abs(i - row)) "
74 " ) "
75 " { "
76 " return [false]; "
77 " } "
78 " }; "
79 " "
80 " return [true]; "
81 ));
82
83 compositor.add(
84 function_t("solve_nqueens")
85 .var("row")
86 .expression
87 (
88 " if (row == n) "
89 " { "
90 " return [true]; "
91 " }; "
92 " "
93 " for (var col := 0; col < n; col += 1) "
94 " { "
95 " if (is_valid(row, col)) "
96 " { "
97 " board[row] := col; "
98 " "
99 " if (solve_nqueens(row + 1)) "
100 " { "
101 " return [true]; "
102 " } "
103 " } "
104 " }; "
105 " "
106 " return [false]; "
107 ));
108
109 const std::string sudoku_solver_program =
110 " if (solve_nqueens(0)) "
111 " { "
112 " println('N-Queens Puzzle Solved!'); "
113 " } "
114 " else "
115 " { "
116 " println('Error: Failed to solve n-queens puzzle.'); "
117 " }; "
118 " "
119 " display_board(); ";
120
121 expression_t expression;
122 expression.register_symbol_table(symbol_table);
123
124 parser_t parser;
125 parser.compile(sudoku_solver_program,expression);
126
127 expression.value();
128}
129
130int main()
131{
132 sudoku_solver<double>();
133 return 0;
134}
void sudoku_solver()