Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
zhhf96
C-Plus-Plus-TheAlgorithms
提交
f4c187b9
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,发现更多精彩内容 >>
未验证
提交
f4c187b9
编写于
8月 09, 2020
作者:
D
David Leal
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[fix/docs]: Improve backtracking/n_queens.cpp
上级
25b39a34
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
107 addition
and
47 deletion
+107
-47
backtracking/n_queens.cpp
backtracking/n_queens.cpp
+107
-47
未找到文件。
backtracking/n_queens.cpp
浏览文件 @
f4c187b9
/**
* @file n_queens.cpp
* @brief [Eight Queens](https://en.wikipedia.org/wiki/Eight_queens_puzzle)
* puzzle
*
* @details
* The **eight queens puzzle** is the problem of placing eight chess queens on
* an 8×8 chessboard so that no two queens threaten 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 non-attacking queens on an n×n chessboard, for which solutions
* exist for all natural numbers n with the exception of n = 2 and n = 3.
*
* @author Unknown author
* @author [David Leal](https://github.com/Panquesito7)
*
*/
#include <iostream>
#define N 4
using
namespace
std
;
void
printSolution
(
int
board
[
N
][
N
])
{
cout
<<
"
\n
"
;
for
(
int
i
=
0
;
i
<
N
;
i
++
)
{
for
(
int
j
=
0
;
j
<
N
;
j
++
)
cout
<<
""
<<
board
[
i
][
j
];
cout
<<
"
\n
"
;
#include <array>
/**
* @namespace backtracking
* @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
];
}
std
::
cout
<<
"
\n
"
;
}
}
bool
isSafe
(
int
board
[
N
][
N
],
int
row
,
int
col
)
{
int
i
,
j
;
/**
* 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
;
/**
* 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
;
}
return
true
;
}
// 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
;
void
solveNQ
(
int
board
[
N
][
N
],
int
col
)
{
if
(
col
>=
N
)
{
printSolution
(
board
);
return
;
}
// Recur to place rest of the queens
solveNQ
<
n
>
(
board
,
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
(
board
,
i
,
col
))
{
/* Place this queen in board[i][col] */
// cout<<"\n"<<col<<"can place"<<i;
board
[
i
][
col
]
=
1
;
/* recur to place rest of the queens */
solveNQ
(
board
,
col
+
1
);
board
[
i
][
col
]
=
0
;
// BACKTRACK
}
board
[
i
][
col
]
=
0
;
// backtrack
}
}
}
}
// namespace backtracking
/**
* Main function
*/
int
main
()
{
int
board
[
N
][
N
]
=
{{
0
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
}};
const
int
n
=
4
;
std
::
array
<
std
::
array
<
int
,
n
>
,
n
>
board
=
{
std
::
array
<
int
,
n
>
({
0
,
0
,
0
,
0
}),
std
::
array
<
int
,
n
>
({
0
,
0
,
0
,
0
}),
std
::
array
<
int
,
n
>
({
0
,
0
,
0
,
0
}),
std
::
array
<
int
,
n
>
({
0
,
0
,
0
,
0
})
};
solveNQ
(
board
,
0
);
return
0
;
backtracking
::
solveNQ
<
n
>
(
board
,
0
);
return
0
;
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录