概率法求解三阶幻方[C语言]
#include <stdio.h> #include <string.h> int in[9]={1,2,3,4,5,6,7,8,9}; int s[9]; int re[3][3]; int sum(int su[]) { int i,re=0; for(i=0;su[i];i++) re+=su[i]; return re; } int main() { int i,j,k,count=0; memset(s,0,sizeof(s)); int SUM = sum(in); if(SUM/9 != (float)SUM/9.0) { printf("wrong\n"); return 0; } for(i=0;i<9;i++) for(j=i+1;j<9;j++) for(k=j+1;k<9;k++) { if(in[i]+in[j]+in[k] == (int)SUM/3) { s[i]++; s[j]++; s[k]++; count++; } } if(count!=8) { printf("wrong\n"); return 0; } int flag=0; for(i=8;i>=0;i--) { if(s[i]==4) re[1][1] = in[i]; if(s[i]==3 && flag==0) { re[0][0] = in[i]; flag++; } else if(s[i]==3 && flag==1) { re[0][2] = in[i]; flag++; } else if(s[i]==3 && flag==2) { re[2][0] = in[i]; flag++; } else if(s[i]==3 && flag==3) { re[2][2] = in[i]; flag++; } } if(re[0][0]+re[1][1]+re[2][2]!=(int)SUM/3) { int tmp; tmp = re[0][0]; re[0][0] = re[2][2]; re[2][2] = tmp; } re[0][1] = (int)SUM/3 - re[0][0] - re[0][2]; re[1][0] = (int)SUM/3 - re[0][0] - re[2][0]; re[1][2] = (int)SUM/3 - re[2][2] - re[0][2]; re[2][1] = (int)SUM/3 - re[2][2] - re[2][0]; for(i=0;i<3;i++) { for(j=0;j<3;j++) { printf("%d ",re[i][j]); } printf("\n"); } return 0; }