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

提示

 

题目来源

算法设计与实验题解

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

posted on 2015-04-10 19:40  Tob__yuhong  阅读(187)  评论(0编辑  收藏  举报

导航