The outputs:
Input the k value: 2
2 2 3 3
2 1 0 3
4 1 1 5
4 4 5 5
Input the k value: 3
Input the k value: 3
3 3 4 4 8 8 9 9
3 2 0 4 8 7 7 9
5 2 2 6 10 10 7 11
5 5 6 6 1 10 11 11
13 13 14 1 1 18 19 19
13 12 14 14 18 18 17 19
15 12 12 16 20 17 17 21
15 15 16 16 20 20 21 21
The codes:
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
//the size of the matrix,origin_row, origin_column,special_row, special_column
const int all_length = 100;
int board[all_length][all_length];
int tile = 1;
void cover_chess_board(int origin_row, int origin_column, int special_row, int special_column, int matrix_size);
void print_matrix(int a[][all_length], int matrix_size);
int main()
{
double k;
cout << "Input the k value: ";
cin >> k;
int matrix_size = pow(2.0,k);
//cout << matrix_size;
int origin_row = 0, origin_column = 0;
int special_row =1 , special_column = 2;
board[special_row][special_column]=0;
cover_chess_board(origin_row, origin_column, special_row, special_column, matrix_size);
print_matrix(board, matrix_size);
return 0;
}
void print_matrix(int a[][all_length], int matrix_size)
{
for(int i = 0; i < matrix_size; ++i){
for(int j = 0; j < matrix_size; ++j){
cout << setw(4) << a[i][j] << " ";
}
cout << endl;
}
}
void cover_chess_board(int origin_row, int origin_column, int special_row, int special_column, int matrix_size)
{
if(matrix_size == 1){
return;
}
int matrix_size_new = matrix_size/2;
int t = tile++;
//left_upper sub matix
if(special_row < origin_row + matrix_size_new && special_column < origin_column + matrix_size_new){
cover_chess_board(origin_row, origin_column, special_row, special_column, matrix_size_new);
}else{
board[origin_row+matrix_size_new-1][origin_column+matrix_size_new-1] = t;
cover_chess_board(origin_row, origin_column, origin_row+matrix_size_new-1, origin_column+matrix_size_new-1, matrix_size_new);
}
//right_upper sub matix
if(special_row < origin_row+matrix_size_new && special_column >= origin_column+matrix_size_new){
cover_chess_board(origin_row, origin_column+matrix_size_new, special_row, special_column, matrix_size_new);
}else{
board[origin_row+matrix_size_new-1][origin_column+matrix_size_new] = t;
cover_chess_board(origin_row, origin_column+matrix_size_new, origin_row+matrix_size-1, origin_column+matrix_size_new, matrix_size_new);
}
//left_lower_sub matix
if(special_row >= origin_row+matrix_size_new && special_column < origin_column + matrix_size_new){
cover_chess_board(origin_row+matrix_size_new, origin_column, special_row, special_column, matrix_size_new);
}else{
board[origin_row+matrix_size_new][origin_column+matrix_size_new-1] = t;
cover_chess_board(origin_row+matrix_size_new, origin_column, origin_row+matrix_size_new, origin_column+matrix_size_new-1, matrix_size_new);
}
// right_lower_sub matix
if(special_row >= origin_row + matrix_size_new && special_column >= origin_column+matrix_size_new){
cover_chess_board(origin_row+matrix_size_new, origin_column+matrix_size_new, special_row, special_column, matrix_size_new);
}else{
board[origin_row+matrix_size_new][origin_column+matrix_size_new] = t;
cover_chess_board(origin_row+matrix_size_new, origin_column+matrix_size_new, origin_row+matrix_size_new, origin_column+matrix_size_new, matrix_size_new);
}
}