/************************************************************************ * ms4x4.c: 4×4魔方陣を全て求める. ------------------------------------------------------------------------ * 奥村晴彦「アルゴリズム辞典」(日本評論社) に載っている全ての4方陣を * 求めるプログラムです. -----------------------------------------------------------------------*/ #include #define B(x) if (ok[x]) { ok[x] = 0; #define E(x) ok[x] = 1; } #define foreach(x) for (x = 1; x <= 16; x++) #define FORMAT "%2d,%2d,%2d,%2d,\n" int main() { int m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44; int i, count=0; int ok11[40], *ok=ok11+11; /* ok[-11..28] */ for (i=-11; i<= 0; i++) ok[i]=0; for (i= 1; i<=16; i++) ok[i]=1; for (i= 17; i<=28; i++) ok[i]=0; foreach(m11) B(m11) for (m44=m11+1; m44<=16; m44++) B(m44) for (m14=m11+1; m14<=16; m14++) B(m14) m41=34-m11-m14-m44; if(m41>m14) B(m41) foreach(m22) B(m22) m33=34-m11-m22-m44; B(m33) foreach(m23) B(m23) m32=34-m14-m23-m41; B(m32) foreach(m12) B(m12) m13=34-m11-m12-m14; B(m13) m42=34-m12-m22-m32; B(m42) m43=34-m13-m23-m33; B(m43) foreach(m21) B(m21) m31=34-m11-m21-m41; B(m31) m24=34-m21-m22-m23; B(m24) m34=34-m31-m32-m33; if (ok[m34]) { printf("%%%% No.%3d\n", ++count); if (m11+m33 == 17) printf("\\PanMagic4{\n"); else printf("\\Magic4{\n"); printf(FORMAT, m11, m12, m13, m14); printf(FORMAT, m21, m22, m23, m24); printf(FORMAT, m31, m32, m33, m34); printf(FORMAT, m41, m42, m43, m44); printf("}\n"); } E(m24) E(m31) E(m21) E(m43) E(m42) E(m13) E(m12) E(m32) E(m23) E(m33) E(m22) E(m41) E(m14) E(m44) E(m11) getchar(); return 0; }