ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

递归与分治策略

2021-03-06 14:31:48  阅读:206  来源: 互联网

标签:策略 递归 int ChessBoard 分治 tr dr tc left


//全排列问题的递归算法
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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有