zoukankan      html  css  js  c++  java
  • n皇后问题 NOJ 1319

                                                        n皇后问题

    时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
    总提交 : 114            测试通过 : 25 

    题目描述

     

    n×格的棋盘上放置彼此不受攻击的个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在n×n格的棋盘上放置n个皇后,任何个皇后不放在同一行或同一列或同一斜线上。设计一个解后问题的队列式分支限界法,计算在n´ n个方格上放置彼此不受攻击的n个皇后的一个放置方案。



    输入

     

    第一行有1 个正整数n。

    输出

     

    将计算出的彼此不受攻击的n个皇后的一个放置方案输出。第1行是n个皇后的放置方案。

    样例输入

    5

    样例输出

    1 3 5 2 4


    这一题很坑的就是输出,居然没有换行符!某学长替我PE了n次啊!

    ff用来判断是否到达边界~

    #include<iostream>
    #include<stdlib.h>
    #include<stdio.h>
    #include<string.h>
    using namespace std;
    int vis[1000][1000];
    //int vis[1000];
    int C[1000];
    int tot=0;
    int n;
    int ff,sum=0;
    void search(int cur)
    {
        int i;
        if(cur==n)
        {
            ff=1;
            return;
        }
        else for(i=0;i<n;i++)
        {
            if(!vis[0][i]&&!vis[1][cur+i]&&!vis[2][cur-i+n])
            {
                C[cur]=i;
                sum+=C[cur];
                vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=1;
                search(cur+1);
                if(ff==1) return ;
                vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=0;
            }
        }
    }
    /*
    void search(int cur,int n)
    {
        int i,j;
        if(cur==n)  tot++;
        else for(i=0;i<n;i++)
        {
           int ok=1;
           C[cur]=i;
           for(j=0;j<cur;j++)
            if(C[cur]==C[j]||cur-C[cur]==j-C[j]||cur+C[cur]==j+C[j])
           {
               ok=0;
               break;
           }
           if(ok)
            search(cur+1,n);
        }
    }
    */
    int main()
    {
        while(scanf("%d",&n)==1)
        {
            ff=0;
            for(int i=0;i<n;i++)
            {
                C[i]=0;
            }
            memset(vis,0,sizeof(vis));
            search(0);
            for(int i=0;i<n;i++)
            {
                if(n!=2&&n!=3)
                {
                    if(i==0)
                    printf("%d",C[0]+1);
                    else
                    printf(" %d",C[i]+1);
                }
            }
            printf(" ");
        }
    }

    n皇后问题

    时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
    总提交 : 114            测试通过 : 25 

    题目描述

     

    n×格的棋盘上放置彼此不受攻击的个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在n×n格的棋盘上放置n个皇后,任何个皇后不放在同一行或同一列或同一斜线上。设计一个解后问题的队列式分支限界法,计算在n´ n个方格上放置彼此不受攻击的n个皇后的一个放置方案。



    输入

     

    第一行有个正整数n

    输出

     

    将计算出的彼此不受攻击的n个皇后的一个放置方案输出。第1行是n个皇后的放置方案。

    样例输入

    5

    样例输出

    1 3 5 2 4

    提示

     

    题目来源

    算法设计与实验题解

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    Trapping Rain Water
    Construct Binary Tree from Preorder and Inorder Traversal
    Flatten Binary Tree to Linked List
    Permutations II
    Unique Paths II
    Path Sum II
    Unique Binary Search Trees II
    evdev module-----uinput.py
    evdev module-----events.py
    evdev module-----device.py
  • 原文地址:https://www.cnblogs.com/Tobyuyu/p/4965568.html
Copyright © 2011-2022 走看看