将A,B,C,D,E,F,G,H这8个变量排成如图所示的大梯形和4个小梯形,这8个变量分别取[1……8]上的整数且互不相等。求使如图所示的梯形和四个小梯形四个角上的变量之和全相等的所有解。
1+4+6+7=1+4+5+8=5+4+3+6=3+2+8+5=7+2+8+1
大梯形四角和 4个小梯形四角和
方法1:
#include <stdio.h> main() { int a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0; int total[4] = {0}; for (a=1;a<=8;++a) { for (b=1;b<=8;++b) { if (a==b) continue; for(c=1;c<=8;++c) { if(b==c || c==a) continue; for(d=1;d<=8;++d) { if(a==d || b==d || c==d) continue; for(e=1;e<=8;++e) { if(a==e || b==e || c==e || d==e) continue; for(f=1;f<=8;++f) { if(a==f || b==f || c==f || d==f || e==f) continue; for(g=1;g<=8;++g) { if(a==g || b==g || c==g || d==g || e==g || f==g) continue; h = 36-(a+b+c+d+e+f+g); total[0] = a+b+c+d; total[1] = a+b+e+f; total[2] = a+e+c+g; total[3] = f+b+h+d; total[4] = e+f+g+h; if (total[0] == total[1] &&total[1] == total[2] && total[2] == total[3] && total[3] == total[4]) { printf("%d/t%d/t%d/t%d/t%d/t%d/t%d/t%d/n",a,b,c,d,e,f,g,36-(a+b+c+d+e+f+g)); } } } } } } } } }
方法2:还没看懂
#include "stdio.h" int a_h[8]; int *side[5][4]={ { a_h+0, a_h+1, a_h+2, a_h+3 }, { a_h+4, a_h+5, a_h+6, a_h+7 }, { a_h+0, a_h+1, a_h+4, a_h+5 }, { a_h+0, a_h+2, a_h+4, a_h+6 }, { a_h+1, a_h+3, a_h+5, a_h+7 }}; int side_total[5]; void main() { int i,j,equal,t; printf(" a b c d e f g h /n"); for(i=0;i<8;i++) /* 给定初始排列 */ a_h[i]=i+1; while(1) { for(i=0;i<5;i++) /* 求各组数字之和 */ { side_total[i]=0; for(j=0;j<4;j++) side_total[i] += *side[i][j]; } for(equal=1,i=0;i<4;i++) /* 比较相等 */ if (side_total[i]!=side_total[i+1]) equal=0; if(equal) /* 打印一组解 */ { for( i=0;i<8;i++ ) printf("- ",a_h[i] ); printf("/n"); } /* 找下一可能的组合 */ for(j=7;j>0;j--) if ( a_h[j] > a_h[j-1] ) break; /* 找到了又一个更大的排列可能 */ if (j==0) break; /* 已没有更大的排列 */ for(i=7;i>=j;i--) /* 寻找交换元素 */ if (a_h[i]>a_h[j-1]) break; t=a_h[j-1]; a_h[j-1]=a_h[i]; a_h[i]=t; /* 交换 */ for(i=7;i>j;i--,j++) /* 颠倒 */ { t=a_h[j]; a_h[j]=a_h[i]; a_h[i]=t;} } }