#include static char puzz[] = "00000" "00 " "0 00" "00 0" "00000"; printpuzz(char *p) { int i; for(i=0;i<25;i++) { switch(p[i]) { case ' ': printf(" "); break; case '0': printf(" 0 "); break; default: printf("%2d ", p[i]); break; } if(!((i+1)%5)) { printf("\n"); } } printf("\n"); } int search(char *prev, int num, double limit) { int i, r1, c1, r2, c2; double newlimit; char puzz2[26]; if(num==14) { printpuzz(prev); return 0; } if(num) for(r1=0;r1<5;r1++) { for(c1=0;c1<5;c1++) if(prev[r1*5+c1] == num) break; if(c1<5) break; } for(r2=0;r2<5;r2++) for(c2=0;c2<5;c2++) if(prev[r2*5+c2] == '0') if(num) { newlimit = sqrt(abs(r1-r2)*abs(r1-r2)+abs(c1-c2)*abs(c1-c2)); if((newlimit - limit) > 0.0000001) { strcpy(puzz2, prev); puzz2[r2*5+c2] = num+1; if(search(puzz2, num+1, newlimit)) return 1; } } else { strcpy(puzz2, prev); puzz2[r2*5+c2] = 1; search(puzz2, 1, 0.0); } return 0; } main() { search(puzz, 0, 0.0); }