The implementation of algorithm of division and conquer

 

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);
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_38396940/article/details/120638650
今日推荐