其他分享
首页 > 其他分享> > 递归与分治策略

递归与分治策略

作者:互联网

//全排列问题的递归算法
void Perm(int list[],int k,int m)
{
    if(k==m)
    {
        for(int i=0; i<=m; i++)
            cout<<list[i]<<" ";
        cout<<endl;
    }
    else
        for(int j=k; j<=m; j++)
        {
            swap(list[k],list[j]);
            Perm(list,k+1,m);
            swap(list[k],list[j]);
        }
}
//正整数n的划分算法
int split(int n,int m)
{
    if(n==1||m==1)
        return 1;
    else if(n<m)
        return split(n,n);
    else if(n==m)
        return split(n,n-1)+1;
    else
        return split(n,m-1)+split(n-m,m);
}
//二分搜索算法
int BinarySearch(int a[],const int&x,int n)
{
    int left=0;
    int right=n-1;
    while(left<=right)
    {
        int middle=(left+right)/2;
        if(x==a[middle])
            return middle;
        if(x>a[middle])
            left=middle+1;
        else
            right=middle-1;
    }
    return -1;
}
//循环赛日程表算法
#define MAX 100
int a[MAX][MAX];
void Copy(int tox,int toy,int fromx,int fromy,int r)
{
    for(int i=0; i<r; i++)
        for(int j=0; j<r; j++)
            a[tox+i][toy+j]==a[fromx+i][fromy+j];
}
void Table(int k)
{
    int i,r;
    int m=1<<k;
    for(i=0; r<n; i++)
        a[0][i]=i+1;
    for(r=1; r<n; r<<=1)
    {
        Copy(r,r+i,0,i,r);
        Copy(r,i,0,r+i,r);
    }
}
//棋盘覆盖问题的分治算法
void ChessBoard(int tr,int tc,int dr,int dc,int size)
{
    if(size==1)
        return ;
    int t=tile++;
    int s=size/2;
    if(dr<tr+s&&dc<tc+s)//覆盖左上角
        ChessBoard(tr,tc,dr,dc,s);
    else
    {
        board[tr+s-1][tc+s-1]=t;
        ChessBoard(tr,tc,dr+s-1; dc+s-1,s);
    }
    if(dr<tr+s&&dc>tc+s)//覆盖右上角
        ChessBoard(tr,tc+s,dr,dc,s);
    else
    {
        board[tr+s-1][tc+s]=t;
        ChessBoard(tr,tc+s,tr+s-1,tc+s,s);
    }
    if(dr>=tr+s&&dc<tc+s)//覆盖左下角
        ChessBoard(tr+s,tc,dr,dc,s);
    else
    {
        board[tr+s][tc+s-1]=t;
        ChessBoard(tr+s,tc,tr+s,tc+s-1,s);
    }
    if(dr>=tr+s&&dc>=tc+s)//覆盖右下角
        ChessBoard(tr+s,tc+s,dr,dc,s);
    else
    {
        board[tr+s][tc+s]=t;
        ChessBoard(tr+s,tc+s,dr+s,dc+s,s);
    }
}
//采用分治策略找出第k小的元素的算法
#define NUM 1001
int a[NUM];
int select(int left,int right,int k)
{
    if(left>=right)
        return a[left];
    int i=left;
    int j=right+1;
    int pivot=a[left];
    while(true)
    {
        do
        {
            i=i+1;
        }
        while(a[i]<pivot);
        do
        {
            j=j-1;
        }
        while(a[j]>pivot);
        if(i>=j)
            break;
        swap(a[i],a[j]);
    }
    if(j-left+1==k)
        return pivot;
    a[left]=a[j];
    a[j]=pivot;
    if(j-left+1<k)
        return select(j+1,right,k-j+left-1);
    else
        return select(left,j-1,k);
}
//输油管道问题
//采用排序算法计算中位数
int youguan1()
{
    int n;
    int x;
    int a[1000];
    cin>>n;
    for(int k=0;i<n;i++)
        cin>>x>>a[k];
    sort(a,a+n);
    int min=0;
    for(int i=0;i<n;i++)
        min+=(int)fabs(a[i]-a[n/2]);
    cout<<min<<endl;
}
//分治
int youguan2()
{
    int n;
    int x;
    int a[1000];
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>x>>a[i];
    int y=select(0,n-1,n/2);
    int min=0;
    for(int i=0;i<n;i++)
        min+=(int)fabs(a[i]-y);
    cout<<min<<endl;
}
//计算半数集问题的递归算法
int comp(int n)
{
    int ans=1;
    if(n>1) for(int i=1;i<=n/2;i++)
        ans+=comp(i);
    a[n]=ans;
    return ans;
}
//计算半数集问题的递归算法---记忆式搜索
int a[1001];
int comp(int n)
{
    int ans=1;
    if(a[n]>0) return a[n];
    for(int i=1;i<=n/2;i++)
        ans+=comp(i);
    a[n]=ans;
    return ans;
}

标签:策略,递归,int,ChessBoard,分治,tr,dr,tc,left
来源: https://blog.csdn.net/weixin_45781121/article/details/114439968