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

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

}

  

posted on 2013-07-13 22:20  止宇  阅读(260)  评论(0编辑  收藏  举报

导航