zoukankan      html  css  js  c++  java
  • 九度OJ 1254:N皇后问题 (N皇后问题、递归、回溯)

    时间限制:1 秒

    内存限制:128 兆

    特殊判题:

    提交:765

    解决:218

    题目描述:

    N皇后问题,即在N*N的方格棋盘内放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在同一斜线上。因为皇后可以直走,横走和斜走如下图)。


    你的任务是,对于给定的N,求出有多少种合法的放置方法。输出N皇后问题所有不同的摆放情况个数。

    输入:

    输入包含多组测试数据。
    每组测试数据输入一个整数n(3<n<=13),表示有n*n的棋盘,总共摆放n个皇后。

    输出:

    对于每组测试数据,输出总共不同的摆放情况个数,结果单独一行。

    样例输入:
    4
    样例输出:
    2

    思路:

    N皇后问题的常规解法是试探回溯法,能够给出所有解。如果只要得到一个解就行,那么还有随机解法。

    相比常规解法,更高效的是位运算解法。

    两者的详细介绍见我的另一篇文章《N皇后问题算法》。


    代码:

    #include <stdio.h>
     
    int n, allPlacedState, count;
     
    void queen(int row, int ld, int rd)
    {
        if (row != allPlacedState)
        {
            int pos = allPlacedState & ~(row | ld | rd);
            while (pos)
            {
                int p = pos & -pos;
                pos -= p;
                queen(row+p, (ld+p)<<1, (rd+p)>>1);
            }
        }
        else
        {
            count ++;
        }
    }
     
    int main()
    {
        while (scanf("%d", &n) != EOF)
        {
            allPlacedState = (1<<n)-1;
            count = 0;
            queen(0, 0, 0);
            printf("%d
    ", count);
        }
        return 0;
    }
    /**************************************************************
        Problem: 1254
        User: liangrx06
        Language: C
        Result: Accepted
        Time:90 ms
        Memory:912 kb
    ****************************************************************/


    编程算法爱好者。
  • 相关阅读:
    VisualC#的菜单编程
    利用Mutex实现应用程序的单实例运行
    C#下实现动态系统托盘图标
    C#中TreeView组件使用方法初步
    VisualC#中实现窗体间的数据传递之一
    AJAX在VS2005中的简单应用
    LiteORM学习一:EntityObject 设计
    读书笔记:人月神话的博客积极的心态读后感
    LiteORM学习三:查询设计
    LiteORM学习二:数据库设计
  • 原文地址:https://www.cnblogs.com/liangrx06/p/5083811.html
Copyright © 2011-2022 走看看