#include <iostream>
using namespace std;
#define MaxLength 1000
void Table(int **A, int start, int end);
void Merge(int **A, int **B, int **C, int n);
int main()
{
int **A;
int n;
int i, j;
//initialize Matrix A
A = new int *[MaxLength];
for(i = 0; i < MaxLength; i++)
{
A[i] = new int[MaxLength];
}
cout<<"Please input the number
of competitor(should be power of
2):"<<endl;
cin>>n;
Table(A, 0, n - 1);
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
cout<<A[i][j]<<"
";
}
cout<<endl;
}
return 0;
}
void Table(int **A, int start, int end)
{
if(start == end - 1)
{
for(int i = 0; i < 2; i++)
for(int j = 0; j < 2; j++)
if(i == j)
A[i][j] = start + 1;
else
A[i][j] = end + 1;
}
else
{
int half = (end - start) / 2;
int **B = new int *[half + 1];
int **C = new int *[half + 1];
for(int i = 0; i < half + 1; i++)
{
B[i] = new int[half + 1];
C[i] = new int[half + 1];
}
Table(B, start, start + half);
Table(C, end - half, end);
Merge(A, B, C, half + 1);
for(int i = 0; i < half; i++)
{
delete B[i];
delete C[i];
}
delete B;
delete C;
}
}
void Merge(int **A, int **B, int **C, int n)
{
int i, j;
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
{
//diagonal elments
A[i][j] = B[i][j];
A[i + n][j + n] = B[i][j];
//anti-diagonal elements
A[i][j + n] = C[i][j];
A[i + n][j] = C[i][j];
}
}
test.out:test.o
g++ -o test.out test.o
test.o:test.cpp
g++ -c test.cpp
Please input the number of competitor(should be power of
2):
8
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