ZTE-中興捧月-北京線下測試賽--B題

題目:把1-16,16個數字填入一個四階矩陣,要求矩陣的每行、每列、兩個對角線上四個數字的和均相等。請編程列出全部的矩陣編程

思路:每行、列對角線都相等,即他們的和都是34,因此先列舉出全部和爲34的組合,再列舉出全部「行的和爲34」的矩陣,再調整使之列、對角線均爲34。調整列和對角線的過程當中的枚舉有些問題,最後得出七個矩陣,還不能斷定該程序是否正確,僅做爲一種思路的參考。bash

#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\n",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\n",array_final[i][k][0],array_final[i][k][1],array_final[i][k][2],array_final[i][k][3]); } printf("\n"); } }複製代碼
相關文章
相關標籤/搜索