zoukankan      html  css  js  c++  java
  • 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
    ",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("
    ");
    	}
    
    }
    

      

  • 相关阅读:
    uva 12426 Counting Triangles 计算几何
    poj 1195 Mobile phones 二维树状数组
    poj 1039 Pipe 计算几何
    poj 3580 SuperMemo 数据结构
    poj 1031 Fence 计算几何
    ArcEngine 无法嵌入互操作类型
    IDL 读取显示HDF文件
    Sql Server 2005 Com+ 警告处理办法
    C# 自定义控件开发
    ArcEngine 获取HDF文件中的子文件
  • 原文地址:https://www.cnblogs.com/txlbupt/p/3188738.html
Copyright © 2011-2022 走看看