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