位运算求解N皇后的过程

46 篇文章 0 订阅
5 篇文章 0 订阅

 8皇后可以用位运算来求,有点好奇的,不过,位运算这个强大的逻辑,没有怀疑,用了n为4的,对于太大的控制台放不下。 

#include<stdio.h>
#define N 4
int result = 0 ;
int count = 1 ;
int upperlim = (1 << N) -1 ;
void com(int row,int ld, int rd) ;
void print_bin(int n);
int main(){
    com(0,0,0) ;
   printf("结果为:%d",result) ;
    return 0 ;
}

void com(int row ,int ld , int rd){
    int pos,p ;
    printf("count = %d \nrow = ",count++) ;
    print_bin(row) ;
    printf(" ") ;
    printf("ld = ") ;
    print_bin(ld) ;
    printf(" ") ;
    printf("rd = ") ;
    print_bin(rd) ;
    printf("\n") ;
    if(row != upperlim){
        pos = upperlim & ~(row | ld | rd) ;
        printf("pos = ") ;
        print_bin(pos) ;
        printf("\n") ;
        while( pos != 0 ){
            p = pos & ( - pos ) ;
            pos = pos - p ;
            com(row + p, (ld + p) << 1 , (rd + p) >> 1) ;
        }
        printf("回溯\n") ;
    }else{
       result++ ;
       printf("第%d个解产生\n",result) ;
    }
}

void print_bin(int n){
   if(n < 2 ){printf("%d",n);}
    else{
        print_bin(n/2) ;
        printf("%d",n%2) ;
    }
}

 输出结果:

 
其实,想作一个图出看看效果,时间有限。
 

参考:http://www.matrix67.com/blog/archives/266

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值