Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
zhhf96
C-Plus-Plus-TheAlgorithms
提交
b7621157
C
C-Plus-Plus-TheAlgorithms
项目概览
zhhf96
/
C-Plus-Plus-TheAlgorithms
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
C-Plus-Plus-TheAlgorithms
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
b7621157
编写于
8月 10, 2020
作者:
D
David Leal
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix: Add namespace member: n_queens
上级
358f56f9
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
77 addition
and
71 deletion
+77
-71
backtracking/n_queens.cpp
backtracking/n_queens.cpp
+77
-71
未找到文件。
backtracking/n_queens.cpp
浏览文件 @
b7621157
...
...
@@ -23,87 +23,93 @@
* @brief Backtracking algorithms
*/
namespace
backtracking
{
/**
* Utility function to print matrix
* @tparam n number of matrix size
* @param board matrix where numbers are saved
*/
template
<
size_t
n
>
void
printSolution
(
const
std
::
array
<
std
::
array
<
int
,
n
>
,
n
>
&
board
)
{
std
::
cout
<<
"
\n
"
;
for
(
int
i
=
0
;
i
<
n
;
i
++
)
{
for
(
int
j
=
0
;
j
<
n
;
j
++
)
{
std
::
cout
<<
""
<<
board
[
i
][
j
]
<<
" "
;
/**
* @namespace n_queens
* @brief Functions for [Eight Queens](https://en.wikipedia.org/wiki/Eight_queens_puzzle) puzzle.
*/
namespace
n_queens
{
/**
* Utility function to print matrix
* @tparam n number of matrix size
* @param board matrix where numbers are saved
*/
template
<
size_t
n
>
void
printSolution
(
const
std
::
array
<
std
::
array
<
int
,
n
>
,
n
>
&
board
)
{
std
::
cout
<<
"
\n
"
;
for
(
int
i
=
0
;
i
<
n
;
i
++
)
{
for
(
int
j
=
0
;
j
<
n
;
j
++
)
{
std
::
cout
<<
""
<<
board
[
i
][
j
]
<<
" "
;
}
std
::
cout
<<
"
\n
"
;
}
}
std
::
cout
<<
"
\n
"
;
}
}
/**
* Check if a queen can be placed on matrix
* @tparam n number of matrix size
* @param board matrix where numbers are saved
* @param row current index in rows
* @param col current index in columns
* @returns `true` if queen can be placed on matrix
* @returns `false` if queen can't be placed on matrix
*/
template
<
size_t
n
>
bool
isSafe
(
const
std
::
array
<
std
::
array
<
int
,
n
>
,
n
>
&
board
,
const
int
&
row
,
const
int
&
col
)
{
int
i
=
0
,
j
=
0
;
/**
* Check if a queen can be placed on matrix
* @tparam n number of matrix size
* @param board matrix where numbers are saved
* @param row current index in rows
* @param col current index in columns
* @returns `true` if queen can be placed on matrix
* @returns `false` if queen can't be placed on matrix
*/
template
<
size_t
n
>
bool
isSafe
(
const
std
::
array
<
std
::
array
<
int
,
n
>
,
n
>
&
board
,
const
int
&
row
,
const
int
&
col
)
{
int
i
=
0
,
j
=
0
;
// Check this row on left side
for
(
i
=
0
;
i
<
col
;
i
++
)
{
if
(
board
[
row
][
i
])
{
return
false
;
}
}
// Check this row on left side
for
(
i
=
0
;
i
<
col
;
i
++
)
{
if
(
board
[
row
][
i
])
{
return
false
;
}
}
// Check upper diagonal on left side
for
(
i
=
row
,
j
=
col
;
i
>=
0
&&
j
>=
0
;
i
--
,
j
--
)
{
if
(
board
[
i
][
j
])
{
return
false
;
// Check upper diagonal on left side
for
(
i
=
row
,
j
=
col
;
i
>=
0
&&
j
>=
0
;
i
--
,
j
--
)
{
if
(
board
[
i
][
j
])
{
return
false
;
}
}
// Check lower diagonal on left side
for
(
i
=
row
,
j
=
col
;
j
>=
0
&&
i
<
n
;
i
++
,
j
--
)
{
if
(
board
[
i
][
j
])
{
return
false
;
}
}
return
true
;
}
}
// Check lower diagonal on left side
for
(
i
=
row
,
j
=
col
;
j
>=
0
&&
i
<
n
;
i
++
,
j
--
)
{
if
(
board
[
i
][
j
])
{
return
false
;
}
}
return
true
;
}
/**
* Solve n queens problem
* @tparam n number of matrix size
* @param board matrix where numbers are saved
* @param col current index in columns
*/
template
<
size_t
n
>
void
solveNQ
(
std
::
array
<
std
::
array
<
int
,
n
>
,
n
>
board
,
const
int
&
col
)
{
if
(
col
>=
n
)
{
printSolution
<
n
>
(
board
);
return
;
}
/**
* Solve n queens problem
* @tparam n number of matrix size
* @param board matrix where numbers are saved
* @param col current index in columns
*/
template
<
size_t
n
>
void
solveNQ
(
std
::
array
<
std
::
array
<
int
,
n
>
,
n
>
board
,
const
int
&
col
)
{
if
(
col
>=
n
)
{
printSolution
<
n
>
(
board
);
return
;
}
// Consider this column and try placing
// this queen in all rows one by one
for
(
int
i
=
0
;
i
<
n
;
i
++
)
{
// Check if queen can be placed
// on board[i][col]
if
(
isSafe
<
n
>
(
board
,
i
,
col
))
{
// Place this queen in matrix
board
[
i
][
col
]
=
1
;
// Consider this column and try placing
// this queen in all rows one by one
for
(
int
i
=
0
;
i
<
n
;
i
++
)
{
// Check if queen can be placed
// on board[i][col]
if
(
isSafe
<
n
>
(
board
,
i
,
col
))
{
// Place this queen in matrix
board
[
i
][
col
]
=
1
;
// Recursive to place rest of the queens
solveNQ
<
n
>
(
board
,
col
+
1
);
// Recursive to place rest of the queens
solveNQ
<
n
>
(
board
,
col
+
1
);
board
[
i
][
col
]
=
0
;
// backtrack
board
[
i
][
col
]
=
0
;
// backtrack
}
}
}
}
}
}
// namespace n_queens
}
// namespace backtracking
/**
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录