算法循环赛.docx

上传人:b****3 文档编号:3853899 上传时间:2022-11-25 格式:DOCX 页数:13 大小:17.40KB
下载 相关 举报
算法循环赛.docx_第1页
第1页 / 共13页
算法循环赛.docx_第2页
第2页 / 共13页
算法循环赛.docx_第3页
第3页 / 共13页
算法循环赛.docx_第4页
第4页 / 共13页
算法循环赛.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

算法循环赛.docx

《算法循环赛.docx》由会员分享,可在线阅读,更多相关《算法循环赛.docx(13页珍藏版)》请在冰豆网上搜索。

算法循环赛.docx

算法循环赛

voidTable(intk,int**a)

{

intn=1;

for(inti=1;i<=k;i++)n*=2;

for(inti=1;i<=n;i++)a[1][i]=i;

intm=1;

for(ints=1;s<=k;s++)

{

n/=2;

for(intt=1;t<=n;t++)

for(inti=m+1;i<=2*m;i++)

for(intj=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;

}

}

1#include

2usingnamespacestd;

3constintSIZE=100;

4inttable[SIZE][SIZE];

5voidfillTable(intx,inty,intstep){

6/*其实step=2的情形也可以用下面的递归通式完成

7if(step==2){

8table[x+1][y+1]=table[x][y];

9table[x][y+1]=table[x+1][y];

10return;

11}*/

12if(step==1)return;

13

14step/=2;//把原问题分为四个表格的填写

15fillTable(x,y,step);//填写左上子表格

16fillTable(x+step,y,step);//填写左下的子表格

17//右上的子表格抄写左下的子表格

18//右下的子表格抄写左上的子表格

19//注意坐标要使用相对坐标

20for(inti=0;i

21for(intj=0;j

22table[x+step+i][y+step+j]=table[x+i][y+j];

23table[x+i][y+step+j]=table[x+step+i][y+j];

24}

25}

26

27intmain(){

28intn;cin>>n;

29for(inti=1;i<=n;i++)table[i][1]=i;

30fillTable(1,1,n);

31for(inti=1;i<=n;i++){

32for(intj=1;j<=n;j++)

33cout<

34cout<

35}

36return0;

37}

1#include

2usingnamespacestd;

3#include

4intmain(){

5intm,n=-1,i,j,k;

6inttwo[20];

7cin>>m;

8j=1;

9for(i=0;i<20;i++){

10two[i]=j;

11if(m==j)n=i;

12j*=2;

13

14}

15cout<

16if(n<0){cout<<"miswrongnumber!

"<

17vector>arr(m,vector(m));

18for(i=0;i

19for(i=0;i

20intupdown=0;

21for(j=0;j

22if(j%two[i]==0)updown++;

23if(updown%2==1){

24for(k=two[i];k<=two[i+1]-1;k++){

25arr[j+two[i]][k]=arr[j][k-two[i]];

26}

27}

28else{

29for(k=two[i];k<=two[i+1]-1;k++){

30arr[j-two[i]][k]=arr[j][k-two[i]];

31}

32}

33}

34}

35

36for(i=0;i

37for(j=0;j

38cout<

39cout<

40}

41return0;

42}

1、算法一:

#include

#defineN64

voidGameTable(intk,inta[][N])

{

//n=2^k(k>=1)个选手参加比赛,二维数组a表示日程安排,数组下标从1开始

intn=2;//k=0,两个选手比赛日程可直接求得

//求解两个选手比赛日程,得到左上角元素

a[1][1]=1;a[1][2]=2;

a[2][1]=2;a[2][2]=1;

inti,j,t;

for(t=1;t

{

    inttemp=n;n=n*2;

    //填左下角元素

   for(i=temp+1;i<=n;i++)

        for(j=1;j<=temp;j++)

            a[i][j]=a[i-temp][j]+temp;//左下角元素和左上角元素的对应关系

        //将左下角元素抄到右上角

        for(i=1;i<=temp;i++)

            for(j=temp+1;j<=n;j++)

                a[i][j]=a[i+temp][(j+temp)%n];

            //将左上角元素抄到右下角

            for(i=temp+1;i<=n;i++)

                for(j=temp+1;j<=n;j++)

                    a[i][j]=a[i-temp][j-temp];

                

                

}

for(i=1;i<=n;i++)//显示日程表

    for(j=1;j<=n;j++)

    {

        printf("-",a[i][j]);

        if(j==n)

            printf("n");

    }

}

voidmain()

{

inta[N][N];

intk;

printf("输入选手的个数:

(注意为2的平方)");

scanf("%d",&k);

GameTable(k,a);

}

2、结果验证

当两个选手,即k=1时

 

当4个选手时,即k=2

 

当8个选手,即k=3

 

当16个选手时,即k=16

 

时间复杂度分析:

迭代处理的循环体内部3个循环语句,每个循环语句都是一个嵌套的for循环,且它们的执行次数相同,基本语句是最内层循环体的赋值语句,即填写比赛日程表的元素。

基本执行语句的执行次数是:

T(n)=

所以时间复杂度为O(4k)

 

改进的算法:

#include   

usingnamespacestd;   

  

constintSIZE=50;   

inta[SIZE][SIZE];   

  

voidcopy(intn);   

voidtournament(intn);    

intodd(intn); //判断奇偶性 

voidmakecopy(intn); //makecopy与copy算法类似,但是区分了n/2为奇数或偶数的情形 

voidcopyodd(intn); //实现n/2为奇数时的复制   

  

void main()   

{   

  

   intn;   

   inti,j;   

   cin>>n;   

   tournament(n);   

   if(odd(n))  //n为奇数和偶数输出情况不同,要分别考虑   

   {   

       for(i=1;i<=n;i++)   

       {   

           for(j=1;j<=n+1;j++)   

               if(a[i][j]==n+1)   

                   cout<<"0 ";   

               else  

                   cout<

           cout<

       }   

   }   

   else  

   {   

       for(i=1;i<=n;i++)   

       {   

           for(j=1;j<=n;j++)   

               cout<

           cout<

       }   

  

   }      

}   

  

voidcopy(intn)       

{   

   intm=n/2;   

   for(inti=1;i<=m;i++)   

       for(intj=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];   

       }   

}   

  

voidtournament(intn)  

{   

   if(n==1)   

   {   

       a[1][1]=1;   

       return;   

   }   

   if(odd(n))   

   {   

       tournament(n+1);   

       return;   

   }   

   tournament(n/2);   

   makecopy(n);   

}   

  

int odd(intn)   

{   

if(n%2==1)

   return1;  

elsereturn0;

}   

  

voidmakecopy(intn) //makecopy与copy算法类似,但是要区分n/2为奇数或偶数的情形   

{   

   if(n/2>1&&odd(n/2))    

       copyodd(n);   

   else  

       copy(n);   

}   

  

voidcopyodd(intn)       //实现n/2为奇数时的复制   

{   

   intb[SIZE];   

   intm=n/2;   

   for(inti=1;i<=m;i++)   

   {   

       b[i]=m+i;   

       b[m+i]=b[i];   

   }   

   for(i=1;i<=m;i++)             

   {   

       for(intj=1;j<=m+1;j++)   

       {   

           if(a[i][j]>m)   

           {   

               a[i][j]=b[i];    

               a[m+i][j]=(b[i]+m)%n;   

           }   

           else  

               a[m+i][j]=a[i][j]+m;   

       }   

       for(j=2;j<=m;j++)   

       {   

           a[i][m+j]=b[i+j-1];   

           a[b[i+j-1]][m+j]=i;   

       }   

   }   

结果验证:

当参赛人数为偶数8时

 

当参赛人数为奇数 7时

#include

voidcopy(intn);

voidtour(intn);

voidmakecopy(intn);

voidcopyodd(intn);

inta[100][100];

intb[100];

intmain()

{

intn,i,j;

printf("Pleaseinputn:

\n");

scanf("%d",&n);

for(i=1;i<=n;i++)

{

a[1][i]=i;

a[i][1]=i;

}

tour(n);

if(n%2==1)

for(i=1;i<=n;i++)

{

for(j=1;j<=n+1;j++)

{

if(a[i][j]==n+1)

printf("");

else

printf("%-4d",a[i][j]);

}

printf("\n");;

}

else

for(i=1;i<=n;i++)

{

for(j=1;j<=n;j++)

{

if(a[i][j]==n+1)

printf("");

else

printf("%-4d",a[i][j]);

}

printf("\n");;

}

}

voidcopy(intn)

{

intm=n/2;

inti,j;

for(i=1;i<=m;i++)

for(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];

}

}

voidtour(intn)

{

if(n==1)

{

a[1][1]=1;

return;

}

if(n%2==1)//奇数

{

tour(n+1);

return;

}

tour(n/2);

makecopy(n);

}

voidmakecopy(intn)

{

if(n/2>1&&((n/2)%2))

copyodd(n);

else

copy(n);

}

voidcopyodd(intn)

{

inti,j;

intm=n/2;

for(i=1;i<=m;i++)

{

b[i]=m+i;

b[m+i]=b[i];

}

for(i=1;i<=m;i++)

{

for(j=1;j<=m+1;j++)

{

if(a[i][j]>m)

{

a[i][j]=b[i];

a[m+i][j]=(b[i]+m)%n;

}

else

{

a[m+i][j]=a[i][j]+m;

}

}

for(j=2;j<=m;j++)

{

a[i][m+j]=b[i+j-1];

a[b[i+j-1]][m+j]=i;

}

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1