Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
zhhf96
C-Plus-Plus-TheAlgorithms
提交
efbcaf25
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,体验更适合开发者的 AI 搜索 >>
提交
efbcaf25
编写于
8月 14, 2020
作者:
F
Filip Hlásek
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'master' into fixgraph
上级
ed5213e3
bae4b4c1
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
126 addition
and
52 deletion
+126
-52
CMakeLists.txt
CMakeLists.txt
+2
-1
backtracking/n_queens.cpp
backtracking/n_queens.cpp
+113
-47
graph/lowest_common_ancestor.cpp
graph/lowest_common_ancestor.cpp
+11
-4
未找到文件。
CMakeLists.txt
浏览文件 @
efbcaf25
...
@@ -18,7 +18,7 @@ endif(MSVC)
...
@@ -18,7 +18,7 @@ endif(MSVC)
option
(
USE_OPENMP
"flag to use OpenMP for multithreading"
ON
)
option
(
USE_OPENMP
"flag to use OpenMP for multithreading"
ON
)
if
(
USE_OPENMP
)
if
(
USE_OPENMP
)
find_package
(
OpenMP
)
find_package
(
OpenMP
3.0 COMPONENTS CXX
)
if
(
OpenMP_CXX_FOUND
)
if
(
OpenMP_CXX_FOUND
)
message
(
STATUS
"Building with OpenMP Multithreading."
)
message
(
STATUS
"Building with OpenMP Multithreading."
)
else
()
else
()
...
@@ -58,6 +58,7 @@ if(DOXYGEN_FOUND)
...
@@ -58,6 +58,7 @@ if(DOXYGEN_FOUND)
set
(
DOXYGEN_STRIP_CODE_COMMENTS NO
)
set
(
DOXYGEN_STRIP_CODE_COMMENTS NO
)
set
(
DOXYGEN_EXT_LINKS_IN_WINDOW YES
)
set
(
DOXYGEN_EXT_LINKS_IN_WINDOW YES
)
set
(
DOXYGEN_BUILTIN_STL_SUPPORT YES
)
set
(
DOXYGEN_BUILTIN_STL_SUPPORT YES
)
set
(
DOXYGEN_EXCLUDE_PATTERNS */build/*
)
set
(
DOXYGEN_ENABLE_PREPROCESSING YES
)
set
(
DOXYGEN_ENABLE_PREPROCESSING YES
)
set
(
DOXYGEN_CLANG_ASSISTED_PARSING YES
)
set
(
DOXYGEN_CLANG_ASSISTED_PARSING YES
)
set
(
DOXYGEN_FILE_PATTERNS *.cpp *.h *.hpp *.md
)
set
(
DOXYGEN_FILE_PATTERNS *.cpp *.h *.hpp *.md
)
...
...
backtracking/n_queens.cpp
浏览文件 @
efbcaf25
/**
* @file
* @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>
#include <iostream>
#define N 4
#include <array>
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
"
;
}
}
bool
isSafe
(
int
board
[
N
][
N
],
int
row
,
int
col
)
{
int
i
,
j
;
/* Check this row on left side */
/**
for
(
i
=
0
;
i
<
col
;
i
++
)
* @namespace backtracking
if
(
board
[
row
][
i
])
* @brief Backtracking algorithms
return
false
;
*/
namespace
backtracking
{
/**
* @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
"
;
}
}
/* Check upper diagonal on left side */
/**
for
(
i
=
row
,
j
=
col
;
i
>=
0
&&
j
>=
0
;
i
--
,
j
--
)
* Check if a queen can be placed on matrix
if
(
board
[
i
][
j
])
* @tparam n number of matrix size
return
false
;
* @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 lower diagonal on left side */
// Check this row on left side
for
(
i
=
row
,
j
=
col
;
j
>=
0
&&
i
<
N
;
i
++
,
j
--
)
for
(
i
=
0
;
i
<
col
;
i
++
)
{
if
(
board
[
i
][
j
])
if
(
board
[
row
][
i
])
{
return
false
;
return
false
;
}
}
return
true
;
// 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
;
}
void
solveNQ
(
int
board
[
N
][
N
],
int
col
)
{
/**
if
(
col
>=
N
)
{
* Solve n queens problem
printSolution
(
board
);
* @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
;
}
}
/* Consider this column and try placing
// Consider this column and try placing
this queen in all rows one by one */
// this queen in all rows one by one
for
(
int
i
=
0
;
i
<
N
;
i
++
)
{
for
(
int
i
=
0
;
i
<
n
;
i
++
)
{
/* Check if queen can be placed on
// Check if queen can be placed
board[i][col] */
// on board[i][col]
if
(
isSafe
(
board
,
i
,
col
))
{
if
(
isSafe
<
n
>
(
board
,
i
,
col
))
{
/* Place this queen in board[i][col] */
// Place this queen in matrix
// cout<<"\n"<<col<<"can place"<<i;
board
[
i
][
col
]
=
1
;
board
[
i
][
col
]
=
1
;
/* recur to place rest of the queens */
// Recursive to place rest of the queens
solveNQ
(
board
,
col
+
1
);
solveNQ
<
n
>
(
board
,
col
+
1
);
board
[
i
][
col
]
=
0
;
// BACKTRACK
board
[
i
][
col
]
=
0
;
// backtrack
}
}
}
}
}
}
}
// namespace n_queens
}
// namespace backtracking
/**
* Main function
*/
int
main
()
{
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
);
backtracking
::
n_queens
::
solveNQ
<
n
>
(
board
,
0
);
return
0
;
return
0
;
}
}
graph/lowest_common_ancestor.cpp
浏览文件 @
efbcaf25
...
@@ -40,6 +40,11 @@
...
@@ -40,6 +40,11 @@
#include <queue>
#include <queue>
#include <cassert>
#include <cassert>
/**
* \namespace graph
* \brief Graph algorithms
*/
namespace
graph
{
/**
/**
* Class for representing a graph as an adjacency list.
* Class for representing a graph as an adjacency list.
* Its vertices are indexed 0, 1, ..., N - 1.
* Its vertices are indexed 0, 1, ..., N - 1.
...
@@ -220,11 +225,13 @@ class LowestCommonAncestor {
...
@@ -220,11 +225,13 @@ class LowestCommonAncestor {
}
}
};
};
}
// namespace graph
/**
/**
* Unit tests
* Unit tests
* @re
r
turns none
* @returns none
*/
*/
void
tests
()
{
static
void
tests
()
{
/**
/**
* _ 3 _
* _ 3 _
* / | \
* / | \
...
@@ -237,8 +244,8 @@ void tests() {
...
@@ -237,8 +244,8 @@ void tests() {
std
::
vector
<
std
::
pair
<
int
,
int
>
>
edges
=
{
std
::
vector
<
std
::
pair
<
int
,
int
>
>
edges
=
{
{
7
,
1
},
{
1
,
5
},
{
1
,
3
},
{
3
,
6
},
{
6
,
2
},
{
2
,
9
},
{
6
,
8
},
{
4
,
3
},
{
0
,
4
}
{
7
,
1
},
{
1
,
5
},
{
1
,
3
},
{
3
,
6
},
{
6
,
2
},
{
2
,
9
},
{
6
,
8
},
{
4
,
3
},
{
0
,
4
}
};
};
RootedTree
t
(
edges
,
3
);
graph
::
RootedTree
t
(
edges
,
3
);
LowestCommonAncestor
lca
(
t
);
graph
::
LowestCommonAncestor
lca
(
t
);
assert
(
lca
.
lowest_common_ancestor
(
7
,
4
)
==
3
);
assert
(
lca
.
lowest_common_ancestor
(
7
,
4
)
==
3
);
assert
(
lca
.
lowest_common_ancestor
(
9
,
6
)
==
6
);
assert
(
lca
.
lowest_common_ancestor
(
9
,
6
)
==
6
);
assert
(
lca
.
lowest_common_ancestor
(
0
,
0
)
==
0
);
assert
(
lca
.
lowest_common_ancestor
(
0
,
0
)
==
0
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录