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

    提示

     

    题目来源

    算法设计与实验题解

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

  • 相关阅读:
    数据结构 算法 — 合并顺序表
    Helloworld(C++语言)
    js收缩菜单
    js日期操作函数
    Oracle 查询 ORA-01722
    初识spring boot(学习中,请多多指教)
    对数据库进行黑盒测试操作?
    虚拟机每次开机都恢复初始化原因
    SecureCRT仿真Linux颜色黑白问题
    《Pro Git》一、阅读理解开篇
  • 原文地址:https://www.cnblogs.com/Tobyuyu/p/4965566.html
Copyright © 2011-2022 走看看