ZTE-中兴捧月-北京线下测试赛--B题

455 阅读3分钟

题目:把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\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");    } }