1. 要求
将1~9填在图中的a0~a8的位置,要求三边4个数相加的和相等,并且分别实现(1)三
边4个数相加的和要最小;(2)三边4个数相加的和要最大。
2. C程序代码
#include <stdio.h> #include <stdlib.h> #define GS 9 #define CHUZHI {1, 2, 3, 4, 5, 6, 7, 8, 9} void pailie(int *, unsigned ); void shuchu(int *, unsigned ); void jiaohuan(int *, int *); int NUMS=0; /* 满足三边4个数相加的和相等的排列数目 */ int yqmin9[GS]={0}; /* 三边4个数相加的和相等且和最小的一组排列 */ int yqmax9[GS]={0}; /* 三边4个数相加的和相等且和最大的一组排列 */ int min=30,max=10; /* 三边4个数相加的和相等且和最小的数及最大的数 */ int main( ) { int yqz[GS]=CHUZHI; pailie(yqz, GS); shuchu( yqmin9, GS ); shuchu( yqmax9, GS ); printf("\n%d %d %d\n",NUMS,min,max); return 0; } // 对 yq 中的后 pljg 几个数据进行全排列 void pailie ( int * yq , unsigned pljg ) { unsigned bjh = GS - pljg , jh ; // 被交换和交换元素的下标 int i; if ( pljg==1 ){ if(((yq[0]+yq[1]+yq[2]+yq[3])==(yq[3]+yq[4]+yq[5]+yq[6])) && ((yq[0]+yq[1]+yq[2]+yq[3])==(yq[0]+yq[6]+yq[7]+yq[8]))){ if(min>(yq[0]+yq[1]+yq[2]+yq[3])) { min=(yq[0]+yq[1]+yq[2]+yq[3]); for(i=0;i<9;i++) yqmin9[i]=yq[i]; } if(max<(yq[0]+yq[1]+yq[2]+yq[3])){ max=(yq[0]+yq[1]+yq[2]+yq[3]); for(i=0;i<9;i++) yqmax9[i]=yq[i]; } NUMS++; } } for (jh = bjh ; jh < GS ; jh ++) { jiaohuan ( yq + bjh , yq + jh ) ; // 交换 pailie ( yq , pljg -1 ) ; // 对后面 pljg-1 个全排列 jiaohuan ( yq + bjh , yq + jh ) ; } } // 输出 void shuchu( int *p , unsigned n ) { unsigned i ; for ( i = 0 ; i < n ; i++ ) { printf("%d",p[i]); } putchar(' '); } // 交换p1和p2所指向对象的值 void jiaohuan(int * p1, int * p2) { int tmp; tmp = *p1; *p1 = *p2; *p2 = tmp; }3. 输出结果
149357286 726851943
864 17 23