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;
}
