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

    提示

     

    题目来源

    算法设计与实验题解

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

  • 相关阅读:
    self 和 super 关键字
    NSString类
    函数和对象方法的区别
    求两个数是否互质及最大公约数
    TJU Problem 1644 Reverse Text
    TJU Problem 2520 Quicksum
    TJU Problem 2101 Bullseye
    TJU Problem 2548 Celebrity jeopardy
    poj 2586 Y2K Accounting Bug
    poj 2109 Power of Cryptography
  • 原文地址:https://www.cnblogs.com/Tobyuyu/p/4965565.html
Copyright © 2011-2022 走看看