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

来源:互联网 发布:网络传真怎么发 编辑:程序博客网 时间:2024/06/04 19:21
求最大公约数(欧几里得算法尾递归版)+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
原创粉丝点击