您的位置:首页 > 其它

递归和分治算法---经典题目

2016-08-26 14:18 309 查看
递归和分治算法---经典题目

//Made by syx

//2010年7月13日 21:05:27

//

//循环赛日程表

//快速排序

//合并排序

//棋盘覆盖(有BUG)

//求大数乘积(10进制,但有丢位)

//二分搜索技术

//整数划分

//阶乘


/*
//循环赛日程表

#include <iostream>

#include <iomanip>

using namespace std;

const int N = 100;

int a

;

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;

}

*/

作者:syxChina

出处:http://syxchina.cnblogs.com
www.jingruigroup.com

本文版权归作者、博客园和百度空间共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则作者会诅咒你的。
如果您阅读了我的文章并觉得有价值请点击此处,谢谢您的肯定1。

分类:
算法学习

好文要顶
关注我
收藏该文







syx278250658
关注 - 22
粉丝 - 254

+加关注

0
0

«
上一篇:Java入门之HelloWorld
»
下一篇:Base64 编解码C语言实现

posted @ 2010-07-18 19:30
syx278250658 阅读(1534) 评论(0)

编辑
收藏
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: