1、算法循环赛一void Table(int k,int * *a) int n=1; for (int i=1;i=k;i+)n* =2; for (int i=1;i=n;i+)a1i=i; int m=1; for (int s=1;s=k;s+) n/=2; for(int t=1;t=n;t+) for(int i=m+1;i=2*m;i+) for(int j=m+1;j=2*m;j+) aij+(t-1)*m*2=ai-mj+(t-1)*m*2-m; aij+(t-1)*m*2-m=ai-mj+(t-1)*m*2; m* =2; 二1 #include 2 using namespa
2、ce std; 3 const int SIZE = 100; 4 int tableSIZESIZE; 5 void fillTable(int x,int y,int step) 6 /*其实step=2的情形也可以用下面的递归通式完成 7 if(step=2) 8 tablex+1y+1=tablexy; 9 tablexy+1=tablex+1y;10 return ;11 */12 if(step=1)return;13 14 step/=2;/把原问题分为四个表格的填写15 fillTable(x,y,step);/填写左上子表格16 fillTable(x+step,y,step
3、);/填写左下的子表格17 /右上的子表格抄写左下的子表格18 /右下的子表格抄写左上的子表格19 /注意坐标要使用相对坐标20 for(int i=0;istep;i+)21 for(int j=0;jn;29 for(int i=1;i=n;i+)tablei1=i;30 fillTable(1,1,n);31 for(int i=1;i=n;i+)32 for(int j=1;j=n;j+)33 couttableij ;34 coutendl;35 36 return 0;37 三1 #include 2 using namespace std ; 3 #include 4 int m
4、ain() 5 int m,n=-1,i,j,k; 6 int two20; 7 cinm; 8 j=1; 9 for(i=0;i20;i+)10 twoi=j;11 if(m=j)n=i;12 j*=2;13 14 15 coutnendl;16 if(n0)coutm is wrong number !endl;return 0;17 vectorvectorarr(m,vector(m);18 for(i=0;im;i+)arri0=i+1;19 for(i=0;in;i+)20 int updown=0;21 for(j=0;jm;j+)22 if(j%twoi=0)updown+;2
5、3 if(updown%2=1)24 for(k=twoi;k=twoi+1-1;k+)25 arrj+twoik=arrjk-twoi;26 27 28 else29 for(k=twoi;k=twoi+1-1;k+)30 arrj-twoik=arrjk-twoi;31 32 33 34 35 36 for(i=0;im;i+)37 for(j=0;jm;j+)38 coutarrij ;39 coutendl;40 41 return 0;42 四1、算法一:#include#define N 64void GameTable(int k,int aN)/n=2k(k=1)个选手参加比赛
6、,二维数组a表示日程安排,数组下标从1开始int n=2;/k=0,两个选手比赛日程可直接求得/求解两个选手比赛日程,得到左上角元素a11=1;a12=2;a21=2;a22=1;int i,j,t;for(t=1;tk;t+)/迭代处理,依次处理22,.,2k个选手比赛日程 int temp=n;n=n*2; /填左下角元素 for(i=temp+1;i=n;i+) for(j=1;j=temp;j+) aij=ai-tempj+temp;/左下角元素和左上角元素的对应关系 /将左下角元素抄到右上角 for(i=1;i=temp;i+) for(j=temp+1;j=n;j+) aij=ai
7、+temp(j+temp)%n; /将左上角元素抄到右下角 for(i=temp+1;i=n;i+) for(j=temp+1;j=n;j+) aij=ai-tempj-temp;for(i=1;i=n;i+)/显示日程表 for(j=1;j=n;j+) printf(- ,aij); if(j=n) printf(n); void main()int aNN;int k;printf(输入选手的个数:(注意为2的平方);scanf(%d,&k);GameTable(k,a);2、结果验证当两个选手,即k=1时当4个选手时,即k=2当8个选手,即k=3当16个选手时,即k=16时间复杂度分析:
8、迭代处理的循环体内部3个循环语句,每个循环语句都是一个嵌套的for循环,且它们的执行次数相同,基本语句是最内层循环体的赋值语句,即填写比赛日程表的元素。基本执行语句的执行次数是:T(n)=所以时间复杂度为O(4k)改进的算法:#includeusing namespace std;const int SIZE = 50;int aSIZESIZE;void copy(int n);void tournament(int n); int odd(int n); /判断奇偶性void makecopy(int n); /makecopy 与copy算法类似,但是区分了n/2为奇数或偶数的情形voi
9、d copyodd(int n); / 实现n/2为奇数时的复制void main() int n; int i,j; cin n; tournament(n); if(odd(n) / n为奇数和偶数输出情况不同,要分别考虑 for(i = 1; i=n; i+) for(j = 1; j=n+1; j+) if(aij = n+1) cout 0 ; else cout aij ; cout endl; else for(i = 1; i=n; i+) for(j = 1; j=n; j+) cout aij ; cout endl; void copy(int n) int m = n/
10、2; for(int i = 1; i=m; i+) for(int j = 1; j 1 & odd(n/2) copyodd(n); else copy(n);void copyodd(int n) / 实现n/2为奇数时的复制 int bSIZE; int m = n/2; for(int i = 1; i=m; i+) bi = m+i; bm+i = bi; for(i = 1; i=m; i+) for(int j=1; j m) aij = bi; am+ij = (bi + m)%n; else am+ij = aij + m; for(j = 2; j=m; j+) aim+
11、j = bi+j-1; abi+j-1m+j = i; 结果验证:当参赛人数为偶数 8时当参赛人数为奇数 7时六#includevoid copy(int n);void tour(int n);void makecopy(int n);void copyodd(int n);int a100100;int b100;int main() int n,i,j; printf(Please input n :n); scanf(%d,&n); for(i=1;i=n;i+) a1i=i; ai1=i; tour(n); if(n % 2 = 1) for(i=1;i=n;i+) for(j=1;
12、j=n+1;j+) if(aij = n +1) printf( ); else printf(%-4d,aij); printf(n); else for(i=1;i=n;i+) for(j=1;j = n;j+) if(aij = n +1) printf( ); else printf(%-4d,aij); printf(n); void copy(int n) int m = n/2; int i,j; for(i=1;i=m;i+) for(j=1;j1 & (n/2)%2) copyodd(n); else copy(n);void copyodd(int n) int i,j; int m=n/2; for(i=1;i=m;i+) bi=m+i; bm+i=bi; for(i=1;i=m;i+) for(j=1;jm) aij=bi; am+ij=(bi+m)%n; else am+ij=aij+m; for(j=2;j=m;j+) aim+j=bi+j-1; abi+j-1m+j=i;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1