zoukankan      html  css  js  c++  java
  • 递归和分治算法经典题目

    //Made by syx
    //2010年7月13日 21:05:27
    //
    //循环赛日程表
    //快速排序
    //合并排序
    //棋盘覆盖(有BUG)
    //求大数乘积(10进制,但有丢位)
    //二分搜索技术
    //整数划分
    //阶乘

    /*
    //循环赛日程表
    #include <iostream>
    #include <iomanip>
    using namespace std;

    const int N = 100;
    int a[N][N];
    int k;
    void copy(int n);
    void tourna(int n);

    int main()
    {
    while( cin >> k )
    {
       memset(a, 0, k * sizeof(int));
       int n = 1;
       int i = 0,j = 0;
       for( i = 0 ; i < k ; i++ )
        n *= 2;
       tourna(n);
       for( i = 1 ; i <= n ; i++ )
       {
        for( j = 1 ; j <= n ; j++ )
        {
         cout<<setw(4)<< a[i][j];
        }
        cout << endl;
       }
    }
    return 0;
    }

    void tourna(int n)
    {
    if( n == 1 )
    {
       a[1][1] = 1;
       return;
    }
    tourna(n/2);
    copy(n);
    }

    void copy(int n)
    {
    int m = n/2;
    for( int i = 1 ; i <= m ; i++ )
    {
       for( int j = 1 ; j <= m ; j++ )
       {
        a[i][j + m] = a[i][j] + m;
        a[i + m][j] = a[i][j + m];
        a[i + m][j + m] = a[i][j];
       }
    }
    }
    */

    /*
    //循环赛日程表
    #include <stdio.h>
    void table(int k,int (*a)[128])
    {
    int n = 1;
    int i = 0;
    for(i=1; i<=k;++i)
       n *= 2;
    for(i=1; i<=n; ++i)
       a[1][i] = i;
    int m = 1,s = 0;
    int t = 0,j = 0;
    for(s=1; s<=k; ++s)
    {
       n /= 2;
       for(t=1; t<=n; ++t)
        for(i=m+1; i<=2*m;++i)
         for(j=m+1; j<=2*m;++j)
         {
          a[i][j+(t-1)*m*2] = a[i-m][j+(t-1)*m*2-m];
          a[i][j+(t-1)*m*2-m] = a[i-m][j+(t-1)*m*2];
         }
         m *= 2;
    }
    }
    int main()
    {
    int a[128][128] = {0};
    table(4,a);

    int _i = 0, _j = 0;
    for(_i=0; _i<9; ++_i)
    {
       for(_j=0; _j<9; ++_j)
        printf("%3d",a[_i][_j]);
       printf("\n");
    }
    printf("\n\n");


    return 0;
    }
    */
    /*
    //快速排序
    #include <stdio.h>

    inline void swap(int &x,int &y)
    {
    int temp = x;
    x = y;
    y = temp;
    }

    int partition(int *a,int left,int right)
    {
    int q = a[left],
       i = left ,
       j = right + 1;
    while(true)
    {
       while(a[++i] < q) ;
       while(a[--j] > q) ;
       if(i>j)
        break;
       swap(a[i],a[j]);
    }
    swap(a[left],a[j]);
    return j;
    }

    void qSort(int *a,int left,int right)
    {
    if(left<right)
    {
       int q = partition(a,left,right);

    // int i = 0;//调试partition函数是否执行正确
    // for( i=0; i<=9; ++i)
    //   printf("%d ",a[i]);
    // printf("\n");
      
    // getchar();
       qSort(a,left,q-1);
       qSort(a,q+1,right);
    }
    }

    int main()
    {
    int a[10] = {9,15,8,4,3,10,1,6,7,12};
    int i = 0;
    for( i=0; i<=9; ++i)
       printf("%d ",a[i]);
    printf("a   \n");

    qSort(a,0,9);

    for( i=0; i<=9; ++i)
       printf("%d ",a[i]);
    printf("a   \n\n");

    return 0;
    }
    */


    /*
    //合并排序
    #include <stdio.h>

    void copy(int *a,int *b,int left,int right)
    {
    while(left<=right)
    {
       a[left] = b[left];
       left++;
    }
    }

    void merge(int *a,int *b,int left,int m,int right)
    {
    int i = left,
       j = m+1,
       k = right;
    while( i<=m && j<= right)
    {
       if(a[i] < a[j])
        b[left++] = a[i++];
       else
        b[left++] = a[j++];
    }

    if(i>m)
       while( j<=right )
        b[left++] = a[j++];
    else
       while( i<=m )
        b[left++] = a[i++];

    }

    void mergeSort(int *a,int left,int right)
    {
    int b[10] = {0};
    if(left<right)
    {
       int i = (left + right) / 2;
       mergeSort(a,left,i);
       mergeSort(a,i+1,right);
       merge(a,b,left,i,right);//合并到数组b
       copy(a,b,left,right);//复制回数组a
    }
    }

    int main()
    {
    int a[10] = {9,15,8,4,3,10,1,6,7,12};
    int b[10] = {9,15,8,4,3,10,1,6,7,12};
    int i = 0;
    for( i=0; i<=9; ++i)
       printf("%d ",a[i]);
    printf("a   \n");

    mergeSort(a,0,9);

    for( i=0; i<=9; ++i)
       printf("%d ",a[i]);
    printf("a   \n\n");

    return 0;
    }
    */

    /*
    //棋盘覆盖(bug)
    #include <stdio.h>
    int tile = 10;
    int board[64][64];
    void chessBoard(int tr,int tc,int dr, int dc,int size)//以0开始,tr是x(自上到下),tc是y(自左到右),后同
    {
    if(size==1) return;
    int t=tile++,
       s=size/2;

    //左上角
    if(dr<tr+s && dc<dc+s)
       chessBoard(tr,tc,dr,dc,s);
    else
    {
       board[tr+s-1][tc+s-1]=t;
       chessBoard(tr,tc,tr+s-1,tc+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,tr+s,tc+s,s);
    }
    }

    int main()
    {
    int sizeTemp,size = 1;
    int i , j;
    scanf("%d",&sizeTemp);
    if(6 < sizeTemp)
       return 0;
    else
    {
       for( i=1; i<=sizeTemp; ++i)
        size *= 2;
       printf("%d\n",size);
    }

    for( i=0; i<=size; ++i)
       for( j=0; j<=size;++j)
        board[i][j] = 0;
    int dr,dc;
    scanf("%d%d",&dr,&dc);
    board[dr-1][dc-1] = 1;
    chessBoard(0,0,dr-1,dc-1,size);

    for( i=0; i<size; ++i)
    {
       for( j=0; j<size;++j)
       {
        printf("%5d",board[i][j]);
       }
       printf("\n");
    }

    return 0;
    }
    */

    //棋盘覆盖
    /*
    #include "iostream.h"
    #include "iomanip.h"
    #define N 8
    class qipan
    {
    public:
    void chessBoard(int tr,int tc,int dr,int dc,int size)
    {
      
       if(size==1)return;
      
       int t=tile++,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,tr+s-1,tc+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,tr+s,tc+s,s);
       }
      
      
    }

    public:
    int tile,tr,tc,dr,dc,size;
    int board[N+1][N+1];



    };


    void main()
    {
    qipan q;
    q.tile=0;


    for(int i1=1;i1<=N;i1++)
    {
       for(int j1=1;j1<=N;j1++)
        q.board[i1][j1]=0;
    }
    q.board[2][2]=-1;
    q.chessBoard(1,1,2,2,N);

    for(int i=1;i<=N;i++)
    {
       for(int j=1;j<=N;j++){
        cout<<setw(4)<<q.board[i][j];}
       cout<<endl;
    }


    }

    */

    /*
    //十进制版求大数乘积
    #include <iostream>
    #include <bitset>
    #include <string>
    #include <cmath>
    using namespace std;

    int _pow(int a,int b)
    {
    int i = 0,result = 1;
    for( i=1; i<=b; ++i)
    {
       result *=a;
    }
    return result;
      
    }
    int main()
    {
    string s1,s2;
    std::cin>>s1>>s2;
    int iwsnum1 = s1.length();
    int iwsnum2 = s2.length();
    int inum = (iwsnum1>iwsnum2)?iwsnum1:iwsnum2;
    int iws = inum / 2;


    string sa(s1,0,s1.length() - iws),sb(s1,sa.length(),s1.length());
    string sc(s2,0,s2.length() - iws),sd(s2,sc.length(),s2.length());

    int ia = atoi(sa.c_str());
    int ib = atoi(sb.c_str());

    int ic = atoi(sc.c_str());
    int id = atoi(sd.c_str());

    int temp1 = ia * ic;
    int temp2 = id * id;
    int result = temp1*_pow(10,iws*2) + ((ia - ib)*(id - ic) + temp1 + temp2)*_pow(10,iws) + temp2 ;

    int num1 =(int) ia*_pow(10,iws) + ib;
    int num2 =(int) ic*_pow(10,iws) + id;

    cout<<"two nums:"<<s1<<"    "<<s2<<endl;
    cout<<"first num before cut   "<<sa<<" "<<sb<<" "<<sb.length()<<endl;
    cout<<"second num before cut "<<sc<<" "<<sd<<" "<<sd.length()<<endl;
    cout<<"num1="<<num1<<"   "<<"num2="<<num2<<endl;
    cout<<"four part: "<<ia<<" "<<ib<<"    "<<ic<<" "<<id<<endl;
    cout<<s1<<"*"<<s2<<"="<<num1*num2<<"(Normal)"<<endl;
    cout<<s1<<"*"<<s2<<"="<<result<<"(syx)"<<endl;
    return 0;
    }
    */


    /*
    //二分搜索技术
    //条件:给定已排好的n个元素a[0..n-1],现要在这n个元素中找出一特定元素x。

    #include <stdio.h>

    int binarySerach(int a[],int n,int x)
    {
    int left = 0,
       right = n - 1;
    while(left <= right)
    {
       int middle = (left + right) / 2;
       if(a[middle] == x) return middle;
       if(x > a[middle]) left = middle + 1;
       else right = middle - 1;
    }
    return -1;
    }

    int main()
    {
    int a[100];
    int i = 0;
    for( i=0; i!=100; ++i)
    {
       a[i] = i;
    }
    int num = 0,result = 0;
    scanf("%d",&num);
    result = binarySerach(a,100,num);
    printf("%d\n",result);
    return 0;
    }
    */


    /*
    //整数划分问题
    #include <stdio.h>
    //q(n,n) 就是求n的划分数!
    int q (int n,int m)   //求在正整数n的所有不同划分中,将最大加数n1不大于m的划分个数记住q(n,m)
    {
    if( (n < 1)||(m < 1) ) return 0;
    if( (n == 1)||(m == 1) ) return 1;
    if(n < m) return q(n,n);
    if(n == m) return q(n,m-1) + 1;
    return q(n,m-1) + q(n-m,m);
    }

    int main()
    {

    int num;
    scanf("%d",&num);
    int i = 0;
    int result = 0;

    result = q(num,num);
    printf("%d\n",result);

    // int i = q(6,2);
    return 0;
    }
    */


    /*
    //1 求阶乘
    #include <stdio.h>

    int JieCheng(int n)
    {
    if(n==1) return 1;
    else return n*JieCheng(n-1);
    }

    int main()
    {

    int num,result;
    scanf("%d",&num);

    result = JieCheng(num);

    printf("%d \n",result);

    int i = 0;
    result = 1;

    for( i = 1; i<20; ++i)
    {
       result = result * i;
       if(num == i)
        printf("i=%d    result=%d\n",i,result);
    }
    return 0;
    }
    */

    作者:BuildNewApp
    出处:http://syxchina.cnblogs.comBuildNewApp.com
    本文版权归作者、博客园和百度空间共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则作者会诅咒你的。
    如果您阅读了我的文章并觉得有价值请点击此处,谢谢您的肯定1。
  • 相关阅读:
    IO模型
    Redis的cluster模式
    #4789. 啊孤独感放辣椒
    #4754. 旅途
    #3189. 八纵八横(c)
    洛谷P2624 [HNOI2008]明明的烦恼
    CF938G Shortest Path Queries
    [CTSC2010]珠宝商
    洛谷P1903 [国家集训队]数颜色 / 维护队列
    AtCoder3611 Tree MST
  • 原文地址:https://www.cnblogs.com/syxchina/p/2197672.html
Copyright © 2011-2022 走看看