8皇后::在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
本程序列出所有解
#include<stdio.h> int a[39];/** 前8个记录答案,后面的数组分别记录15条/斜边和15条\斜边*/ #define s(d) a[j]d[j+i+7]d[j-i+31] main(int i, char **x) { int j=8; for(;j--;i>8?printf("%d%c",a[j],j?' ':'\n'): (s(|a))||(s(=a)=i,main(i+1, 0),s(=a)=0)); return 0; }
数独
#include<stdio.h> #define TEST_NUM4 "000" "600" "142"\ "026" "000" "000"\ "700" "004" "009"\ \ "000" "006" "200"\ "060" "901" "050"\ "005" "300" "000"\ \ "900" "400" "007"\ "000" "000" "810"\ "842" "007" "000" const int c[10] = {0x0,0x1,0x2,0x4,0x8,0x10,0x20,0x40,0x80,0x100}; int a[81]; int b[27]; #define M(g,k) (b[g%9]|b[(g/9)+9]|b[18+(g/27)*3+((g%9)/3)])&c[k] #define L(g,k) b[g%9]^=c[k],b[(g/9)+9]^=c[k],b[18+(g/27)*3+((g%9)/3)]^=c[k] int t(int i,int p) { int k; if(i>81){ // putA(); return 1;/** got it */ } while(p<81&&a[p])p++; for(k=9;k;--k){ if(!(M(p,k))){ a[p]=k; L(p,k); if(t(i+1,p+1)) return 1; a[p]=0; L(p,k); } } return 0; } main(int i, char **x) { const char *pcFunc= TEST_NUM4; int j=0,k=1; for(;*pcFunc;pcFunc++,j++){/** init */ if (a[j]=*pcFunc-'0'){ L(j,a[j]); k++; } } t(k,0);/** get */ for(j=81;j--;){ printf("%d%c",a[80-j],j%9?' ':'\n'); } return 0; }