题目:把1-16,16个数字填入一个四阶矩阵,要求矩阵的每行、每列、两个对角线上四个数字的和均相等。请编程列出所有的矩阵
思路:每行、列对角线都相等,即他们的和都是34,所以先列举出所有和为34的组合,再列举出所有“行的和为34”的矩阵,再调整使之列、对角线均为34。调整列和对角线的过程中的枚举有些问题,最后得出七个矩阵,还不能判定该程序是否正确,仅作为一种思路的参考。
#include <stdio.h> #include <memory.h> int sum_34[100][4]; int array_line_34[400][4][4]; int array_row_34[120][4][4]; int array_final[120][4][4]; int array_row_34_num=0; bool count_final(int temp[4][4]){//调整使对角线的和为34 int i,j,k,l,m=0; int temp2[4][4]; memset(temp2,0,sizeof(temp2)); for (i=0;i<4;i++){ for (j=0;j<4;j++){ for (k=0;k<4;k++){ for(l=0;l<4;l++){ if (temp[0][i]+temp[1][j]+temp[2][k]+temp[3][l]==34&&i!=j&&i!=k&&i!=l&&j!=k&&j!=l&&k!=l) { for (m=0;m<4;m++) { temp2[m][0]=temp[m][i]; } for (m=0;m<4;m++) { temp2[m][1]=temp[m][j]; } for (m=0;m<4;m++) { temp2[m][2]=temp[m][k]; } for (m=0;m<4;m++) { temp2[m][3]=temp[m][l]; } if (temp2[0][3]+temp2[1][2]+temp2[2][1]+temp2[3][0]==34) { memcpy(temp,temp2,sizeof(temp2)); memset(temp2,0,sizeof(temp2)); return true; } } } } } } return false; } bool count_row(int temp[4][4]){//调整使列的和为34 int i,j,k,l,m=0; int temp2[4][4]; int temp3[4][4]; memset(temp2,0,sizeof(temp2)); memcpy(temp3,temp,sizeof(temp3)); for (i=0;i<4;i++){ for (j=0;j<4;j++){ for (k=0;k<4;k++){ for(l=0;l<4;l++){ if (temp3[0][i]+temp3[1][j]+temp3[2][k]+temp3[3][l]==34) { temp2[0][m]=temp3[0][i]; temp2[1][m]=temp3[1][j]; temp2[2][m]=temp3[2][k]; temp2[3][m]=temp3[3][l]; temp3[0][i]=temp3[1][j]=temp3[2][k]=temp3[3][l]=0; m++; } if (temp2[3][3]!=0) { memcpy(array_row_34[array_row_34_num],temp2,sizeof(temp2)); array_row_34_num++; memcpy(temp3,temp,sizeof(temp3)); memset(temp2,0,sizeof(temp2)); return true; } } } } } // else return true; } bool count_line(int temp[4][4]){//现在每行的和为34,但是可能有重复的数字,所以要把有重复数字的矩阵去掉 int number[17]; memset(number,0,sizeof(number)); int i=0,j=0; for(i=0;i<4;i++){ for(j=0;j<4;j++){ if(number[temp[i][j]]==1) return false; else number[temp[i][j]]=1; } } return true; } void main(){ int i,j,k,l,sum_34_num=0; for(i=1;i<=16;i++){ for (j=i+1;j<=16;j++){ for(k=j+1;k<=16;k++){ for (l=k+1;l<=16;l++) { if (i+j+k+l==34) { sum_34[sum_34_num][0]=i; sum_34[sum_34_num][1]=j; sum_34[sum_34_num][2]=k; sum_34[sum_34_num][3]=l; sum_34_num++; } } } } } // for (i=0;i<sum_34_num;i++) // { // printf("%d %d %d %d ",sum_34[i][0],sum_34[i][1],sum_34[i][2],sum_34[i][3]); // } int m=0,array_line_34_num=0; int temp[4][4]; for (i=0;i<sum_34_num-3;i++) { for (j=i+1;j<sum_34_num-2;j++) { for (k=j+1;k<sum_34_num-1;k++) { for (l=k+1;l<sum_34_num;l++) { for (m=0;m<4;m++) { temp[0][m]=sum_34[i][m]; temp[1][m]=sum_34[j][m]; temp[2][m]=sum_34[k][m]; temp[3][m]=sum_34[l][m]; } if (count_line(temp)) { memcpy(array_line_34[array_line_34_num],temp,sizeof(temp)); array_line_34_num++; } } } } } for (i=0;i<array_line_34_num;i++) { memcpy(temp,array_line_34[i],sizeof(array_line_34[i])); count_row(temp); } int array_final_num=0; for (i=0;i<array_row_34_num;i++) { memcpy(temp,array_row_34[i],sizeof(array_row_34[i])); if (count_final(temp)) { memcpy(array_final[array_final_num],temp,sizeof(temp)); array_final_num++; } } for (i=0;i<array_final_num;i++) { for (k=0;k<4;k++) { printf("%d %d %d %d ",array_final[i][k][0],array_final[i][k][1],array_final[i][k][2],array_final[i][k][3]); } printf(" "); } }