0
点赞
收藏
分享

微信扫一扫

c++求解九宫格问题

九月的栩 2022-01-26 阅读 65

将1至9这9个数填在一个3*3的框内,使得行列的和等于一个常数N。
请用代码实现求出这样的常量有哪些?分别对应的填数法有哪些?

#include <iostream>
#include <vector>

//此数组标记已经放到框中的数字。
bool mark[10] = {0};

//此数组代表3*3的框
int matrix[3][3] = {0};

//此数组存放结果。
std::vector<std::vector<std::vector<int>>> res;

bool row_col_sum_equal(){
    int sum = matrix[0][0] + matrix[0][1] + matrix[0][2];
    for(int i=0; i<3; ++i){
        if(matrix[i][0] + matrix[i][1] + matrix[i][2] != sum)
            return false;
        if(matrix[0][i] + matrix[1][i] + matrix[2][i] != sum)
            return false;
    }
    return true;
}

//参数gird_index代表此层递归是往第几个格子放的,格子序号按行序号,从0开始,范围0-8
void dfs(int gird_index){
    //递归终止条件
    if(gird_index > 8){
        if(row_col_sum_equal()){
            std::vector<int> temp_row0(matrix[0], matrix[0]+3);
            std::vector<int> temp_row1(matrix[1], matrix[1]+3);
            std::vector<int> temp_row2(matrix[2], matrix[2]+3);
            res.push_back( std::vector<std::vector<int>>{temp_row0, temp_row1, temp_row2} );
        }
        return;
    }
    for(int i=1; i<=9; ++i){
        if(!mark[i]){
            mark[i] = true;
            matrix[gird_index/3][gird_index%3] = i;
            dfs(gird_index+1);
            mark[i] = false;
        }
    }
}


int main() {
    dfs(0);

    printf("共%d种填法\n\n", res.size());

    //输出结果
    for(int i=0; i<res.size(); ++i){
        std::cout<<"-------------------------"<<std::endl;
        std::cout<<"符合条件的常数:"<<res[i][0][0]+res[i][0][1]+res[i][0][2]<<std::endl;
        std::cout<<"对应的填法:"<<std::endl;
        for(int z=0; z<3; ++z){
            printf("%5d %5d %5d\n", res[i][z][0], res[i][z][1], res[i][z][2]);
        }
    }
    return 0;
}

举报

相关推荐

0 条评论