• 欢迎访问开心洋葱网站,在线教程,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入开心洋葱 QQ群
  • 为方便开心洋葱网用户,开心洋葱官网已经开启复制功能!
  • 欢迎访问开心洋葱网站,手机也能访问哦~欢迎加入开心洋葱多维思维学习平台 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏开心洋葱吧~~~~~~~~~~~~~!
  • 由于近期流量激增,小站的ECS没能经的起亲们的访问,本站依然没有盈利,如果各位看如果觉着文字不错,还请看官给小站打个赏~~~~~~~~~~~~~!

C语言示范 8皇后和数独

OC/C/C++ 水墨上仙 1646次浏览

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


开心洋葱 , 版权所有丨如未注明 , 均为原创丨未经授权请勿修改 , 转载请注明C语言示范 8皇后和数独
喜欢 (0)
加载中……