2014-10-20

  //把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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值