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 }

 以后分治核心算法函数名我都将采用dacdivide and conquer

posted @ 2021-08-11 10:46  Rekord  阅读(657)  评论(0编辑  收藏  举报