求最大公约数(欧几里得算法尾递归版)+N皇后算法(位运算版)

求最大公约数(欧几里得算法尾递归版)+N皇后算法(位运算版

求最大公约数思路:沿用欧几里得算法直接出最简洁代码,数学证明重点在于gcd(a, b) =  gcd(b, amodb)上。

转载请注明出处,原文地址为:http://blog.csdn.net/powerwoo25/article/details/47407603
/* 欧几里得算法求最大公约数*/
int euclid(unsigned int a, unsigned int b)
{
    if(b == 0)
    {
        return a;
    }
    else
    {
        return euclid(b, a%b);
    }
}

N皇后问题思路:利用二进制位提供皇后的位置约束,主要算法为深度搜索加剪枝

转载请注明出处,原文地址为:http://blog.csdn.net/powerwoo25/article/details/47407603
/* N皇后算法 */
int hitCount = 0, colMask = 1;

/* 默认从第一行开始摆放皇后 */
void DFS(int usedCol, int unAvailablePre, int unAvailableNext)
{
    if(usedCol != colMask)
    {
        int availPos = colMask & ~(usedCol | unAvailablePre | unAvailableNext);
        /* 在当前行里面有一些列位置允许摆放 */
        while(availPos != 0)
        {
            /* 选中最小的列 */
            int tagPos = availPos & -availPos;
            /* 记录这个皇后摆放的列数,并且记录下一行摆放皇后时不能使用的当前摆放位置的前一列与后一列
                这一部分多作说明一下,第一个参数排除掉了下一个皇后与已经摆放的皇后同排的情况,第二三个参数
                排除了下一个皇后与当前已经摆放皇后同一斜线的情况 */
            DFS(usedCol + tagPos, (unAvailablePre + tagPos) << 1, (unAvailableNext + tagPos) >> 1);
            /* 用于挑选下一个可用<span style="font-family:Microsoft YaHei;">列</span> */
            availPos -= tagPos;
        }
    }
    else
    {
        ++hitCount;
    }
}

int NQueenProblem(int n)
{
    colMask = (colMask << n) - 1;
    DFS(0, 0, 0);
    return hitCount;
}

主函数

#include <stdio.h>

int main()
{
//    unsigned int m, n;
//    while(~scanf("%d %d", &m, &n))
//    {
//        printf("%d\n", euclid(m, n));
//    }
    unsigned int n;
    while(~scanf("%d", &n))
    {
        printf("%d\n", NQueenProblem(n));
        hitCount = 0; colMask = 1;
    }
    return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值