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

    提示

     

    题目来源

    算法设计与实验题解

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

  • 相关阅读:
    获取Android控件宽高
    Android面试题:大图加载,防止OOM
    Android面试题:讲一讲Glide的原理
    面试题:实现一个容器,提供两个方法,add,size;写两个线程,线程1添加10个元素到容器中,线程2实现监控元素的个数,当个数到5个时,线程2给出提示并结束
    Java线程中断的三种方法
    Java的四种引用:强引用、软引用,弱引用和虚引用
    Bellman-Ford(可解决负权边)--时间复杂度优化
    【Leetcode 动态规划、深度优先搜索】不同路径(62)、 不同路径 II(63)、不同路径 III(980)
    ElasticSearch scroll分页查询
    MySQL Myisam引擎和Innodb引擎的区别
  • 原文地址:https://www.cnblogs.com/Tobyuyu/p/4965567.html
Copyright © 2011-2022 走看看