//把in_order[L1...R1]和post_order[L2...R2]建成一棵二叉树,返回树根
int build(int L1,int R1, int L2, int R2){
if(L1 > R1)
return 0;//空树
int root = post_order[R2];
int p = L1;
while(in_order[p] != root)
p++;
int cnt = p-L1;//左子树的结点个数
lch[root] = build(L1, P-1, L2, L2+cnt-1);
rch[root] = build[p+1,R1, L2+cnt,R2-1];
return root;
}
//拓扑排序
假设有n个变量,还有m个二元数组(u,v),分别表示变量u小于v。那么,将所有变量
从小到大排列起来。如果图中存在有向环,则不存在拓扑排序,反之则存在,可以借助DFS完成
拓扑排序。
int c[maxn];
int topo[maxn],t;
bool dfs(int u){
c[u] = -1;//访问标志
for(int v=0; v < n; v++ )
if(G[u][v]){
if(c[v] < 0)
return false;//存在有向环,失败退出
else if(c[v] == 0 && dfs(v) == false){
return false;
}
c[u] = 1;
topo[--t] = u;
return true;
}
}
bool toposort(){
t = n;
memset(c,0,sizeof(c));
for(int i = 0; i < n; i++){
if(c[i] == 0)
if(dfs(i) == 0)
return false;
return true;
}
}
//枚举排列--生成1-n的排列(采用递归的思想)
//!!!C语言中的函数在接受数组参数时无法得知数组元素的个数,所以需要传一个
//已经填好的位置个数,或者当前需要确定的元素位置cur
void print_permutation(int n, int *A,int cur){
if(cun == n){
for(int i = 0 ;i < n; i++){
printf("%d", A[i]);
printf("\n");
}
} //递归边界
else for(int i = 1; i <= n; i++){
int ok = 1;
for(int j = 0; j < cur; j++){
if(A[j] == i)
ok = 0;
}
if(ok){
A[cur] = 1;
print_permutation(n, A, cur+1);
}
}
}
方法二:使用C++中STL
#include<cstdio>
#include<algorithm>
using namespace std;
int main(){
int n ,p[10];
scanf("%d", &n);
for(int i = 0;i < n; i++){
scanf("%d", &p[i]);
}
sort(p, p+n);
do{
for(int i = 0; i <n ;i++)
printf("%d",p[i]);
}while(next_permutation(p,p+n));
return 0;
}
//八皇后问题
void search(int cur){
if(cur == n){
tot++;
}
else
for(int i = 0; i < n ;i++){
int ok = 1;
c[cur] = i;//尝试把第cur行的皇后放在第i列
//检查是否和前面的皇后冲突
for(int j = 0; j < cur; j++)
if(c[cur] == c[j] || cur-c[cur] == j - c[j] || cur+c[cur] == j + c[j]){
ok = 0;
break;
}
if(ok)
search(cur+1);
}
}
int build(int L1,int R1, int L2, int R2){
if(L1 > R1)
return 0;//空树
int root = post_order[R2];
int p = L1;
while(in_order[p] != root)
p++;
int cnt = p-L1;//左子树的结点个数
lch[root] = build(L1, P-1, L2, L2+cnt-1);
rch[root] = build[p+1,R1, L2+cnt,R2-1];
return root;
}
//拓扑排序
假设有n个变量,还有m个二元数组(u,v),分别表示变量u小于v。那么,将所有变量
从小到大排列起来。如果图中存在有向环,则不存在拓扑排序,反之则存在,可以借助DFS完成
拓扑排序。
int c[maxn];
int topo[maxn],t;
bool dfs(int u){
c[u] = -1;//访问标志
for(int v=0; v < n; v++ )
if(G[u][v]){
if(c[v] < 0)
return false;//存在有向环,失败退出
else if(c[v] == 0 && dfs(v) == false){
return false;
}
c[u] = 1;
topo[--t] = u;
return true;
}
}
bool toposort(){
t = n;
memset(c,0,sizeof(c));
for(int i = 0; i < n; i++){
if(c[i] == 0)
if(dfs(i) == 0)
return false;
return true;
}
}
//枚举排列--生成1-n的排列(采用递归的思想)
//!!!C语言中的函数在接受数组参数时无法得知数组元素的个数,所以需要传一个
//已经填好的位置个数,或者当前需要确定的元素位置cur
void print_permutation(int n, int *A,int cur){
if(cun == n){
for(int i = 0 ;i < n; i++){
printf("%d", A[i]);
printf("\n");
}
} //递归边界
else for(int i = 1; i <= n; i++){
int ok = 1;
for(int j = 0; j < cur; j++){
if(A[j] == i)
ok = 0;
}
if(ok){
A[cur] = 1;
print_permutation(n, A, cur+1);
}
}
}
方法二:使用C++中STL
#include<cstdio>
#include<algorithm>
using namespace std;
int main(){
int n ,p[10];
scanf("%d", &n);
for(int i = 0;i < n; i++){
scanf("%d", &p[i]);
}
sort(p, p+n);
do{
for(int i = 0; i <n ;i++)
printf("%d",p[i]);
}while(next_permutation(p,p+n));
return 0;
}
//八皇后问题
void search(int cur){
if(cur == n){
tot++;
}
else
for(int i = 0; i < n ;i++){
int ok = 1;
c[cur] = i;//尝试把第cur行的皇后放在第i列
//检查是否和前面的皇后冲突
for(int j = 0; j < cur; j++)
if(c[cur] == c[j] || cur-c[cur] == j - c[j] || cur+c[cur] == j + c[j]){
ok = 0;
break;
}
if(ok)
search(cur+1);
}
}