循环赛日程表

来源:互联网 发布:ping网络命令的使用 编辑:程序博客网 时间:2024/04/28 10:57

对于书上那个日程表的实现,第三版的课本给出了循环实现的方法,不过这个表的生成明显要用递归方法生成更为合适,此表如下:

可以看到每次该表的生成总可以分成四个字表的填充过程,初始化让左边第一列填充上之后,然后每一次先递归填充左上角的子表,然后再填充左下角的子表,然后右上和右下的子表用copy的方法填充,实现代码如下:

 1 #include<iostream> 2 using namespace std; 3 const int SIZE = 100; 4 int table[SIZE][SIZE]; 5 void fillTable(int x,int y,int step){ 6     /*其实step=2的情形也可以用下面的递归通式完成 7     if(step==2){ 8         table[x+1][y+1]=table[x][y]; 9         table[x][y+1]=table[x+1][y];10         return ;11     }*/12     if(step==1)return;13 14     step/=2;//把原问题分为四个表格的填写15     fillTable(x,y,step);//填写左上子表格16     fillTable(x+step,y,step);//填写左下的子表格17     //右上的子表格抄写左下的子表格18     //右下的子表格抄写左上的子表格19     //注意坐标要使用相对坐标20     for(int i=0;i<step;i++)21         for(int j=0;j<step;j++){22             table[x+step+i][y+step+j]=table[x+i][y+j];23             table[x+i][y+step+j]=table[x+step+i][y+j];24         }25 }26 27 int main(){28     int n;cin>>n;29     for(int i=1;i<=n;i++)table[i][1]=i;30     fillTable(1,1,n);31     for(int i=1;i<=n;i++){32         for(int j=1;j<=n;j++)33             cout<<table[i][j]<<" ";34         cout<<endl;35     }36     return 0;37 }
原创粉丝点击