1325:【例7.4】 循环比赛日程表
当m=3时
第一天 | 第二天 | 第三天 | 第四天 | 第五天 | 第六天 | 第七天 | |
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
2 | 1 | 4 | 3 | 6 | 5 | 8 | 7 |
3 | 4 | 1 | 2 | 7 | 8 | 5 | 6 |
4 | 3 | 2 | 1 | 8 | 7 | 6 | 5 |
5 | 6 | 7 | 8 | 1 | 2 | 3 | 4 |
6 | 5 | 8 | 7 | 2 | 1 | 4 | 3 |
7 | 8 | 5 | 6 | 3 | 4 | 1 | 2 |
8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
显而易见,整个矩阵是中心对称的,并且还可以发现每个“小矩阵”也是中心对称的。
那么这就符合了分治的基本条件——大问题与小问题有相同的处理方式。
“填写”数组时“参考位置”皆已填写。
1 #include<iostream> 2 using namespace std; 3 4 const int N=1005; 5 int a[N][N]; 6 //divide and conquer 7 void dac(int b,int e){ 8 if(b==e){ 9 a[1][b]=b; 10 return; 11 } 12 int mid=(b+e)/2; 13 dac(b,mid); 14 dac(mid+1,e); 15 for(int i=(e-b+1)/2+1;i<=e-b+1;i++){ 16 for(int j=b;j<=e;j++){ 17 a[i][j]=a[e-b-i+2][e-j+b]; 18 } 19 } 20 } 21 int main(){ 22 int m,n; 23 cin>>m; 24 n=1<<m; 25 dac(1,n); 26 for(int i=1;i<=n;i++){ 27 for(int j=1;j<=n;j++) 28 cout<<a[i][j]<<" "; 29 cout<<endl; 30 } 31 return 0; 32 }
以后分治核心算法函数名我都将采用dac(divide and conquer)