dfs——n皇后问题

C - N皇后问题

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=15;
int ans[maxn]; //用ans数组来记录n*n阶乘两个皇后的摆放数
int n;//表示棋盘的大小
int ans1;//ans1为摆放数
int ye[maxn]={0};
bool ok(int x,int y){//用于判断所放位置的皇后是否符合要求。
//若ok输出true,否则就false
    for(int i=0;i<x;i++)
        if(ye[i]==y||(x+y==i+ye[i])||(x-y==i-ye[i]))
            return false;
    return true;
}
void dfs(int x1){//深度优先搜索//x1表示为行数
    if(x1==n){
        ans1++;
        return ;
    }
    for(int y1=0;y1<n;y1++){//在每一列放皇后;y1表示为列数
        if(ok(x1,y1)){//检查是否合法
            ye[x1]=y1;//在第x1 行的 y1 列放皇后
            bfs(x1+1);//回溯//继续放下一行皇后
        }
    }
}
int main(){
    int i;int j;
    memset(ans,-1,sizeof(ans));//将ans数组赋为-1,用于打表,减少时间复杂度
    while(scanf("%d",&n)!=EOF){
        if(n==0)break;
        if(ans[n]<0){//当ans【n】<0,即该情况下未被计算,进行计算
//若不<0,则直接输出ans【n】中的值
//算出所有 n 皇后的答案。先打表不然会超时
        memset(ye,0,sizeof(ye)); //清空,准备计算下一个 N 皇后问题
        ans1=0;
        dfs(0);//开始搜索
        ans[n]=ans1;
        printf("%d\n",ans[n]);
        }
        else printf("%d\n",ans[n]);
    }
    return 0;
}

这道题用dfs(深度优先搜索)来做的,

这道要注意的是要打表,否则就会超时。打表能节约计算,节约时间。

该题可作为做dfs题的模板。

原文地址:https://www.cnblogs.com/kitalekita/p/12210120.html

时间: 2024-11-03 14:43:32

dfs——n皇后问题的相关文章

kb-01-a&lt;简单搜索--dfs八皇后问题变种&gt;

题目描述: 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C. Input 输入含有多组测试数据. 每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目. n <= 8 , k <= n 当为-1 -1时表示输入结束. 随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域,

POJ 1321 棋盘问题(dfs八皇后变形)

棋盘问题 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 25147   Accepted: 12424 Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C. Input 输入含有多组测试数据. 每组数据的第一行是两个正整数,n k,用一个空格隔开,表示

dfs 例题皇后问题

题目描述 一个如下的 6 \times 66×6 的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列 2\ 4\ 6\ 1\ 3\ 52 4 6 1 3 5 来描述,第 ii 个数字表示在第 ii 行的相应位置有一个棋子,如下: 行号 1\ 2\ 3\ 4\ 5\ 61 2 3 4 5 6 列号 2\ 4\ 6\ 1\ 3\ 52 4 6 1 3 5 这只是棋子放置的一个解.请编一个程序找出所有棋子

HDU - 2553 N皇后问题(dfs)

题意:每行放一个棋子,棋子不能在同一行同一列,对角线. 这道题关键在剪枝.剪枝完了就是递归咯. 剪枝: (a[i]数组里面装选择的列). 某一行的a[i]不能和a[n]冲突,所以有以下4个需要判断的条件: a.行与行之间不能冲突,但是因为我们就是每一行求一个皇后位置,所以肯定不会冲突,不需要考虑啦. b.列与列直接不能冲突,a[n]!=a[i]. c.不在同一对左角线,a[n]-a[i]!=n-i. d.不在同一对右角线,a[n]-a[i]!=-(n-i). 然后c和d合并一下就是abs(a[n

hdu 2553 N皇后问题 经典搜索,DFS解法

N皇后问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 10239    Accepted Submission(s): 4609 Problem Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上. 你的任务是,对于给定的N,

HDOJ2553-N皇后问题(DFS)

N皇后问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 12279    Accepted Submission(s): 5535 Problem Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上.你的任务是,对于给定的N,求出

棋盘问题 dfs分层搜索(n皇后变式)

棋盘问题 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 47960   Accepted: 23210 Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C. Input 输入含有多组测试数据. 每组数据的第一行是两个正整数,n k,用一个空格隔开,表示

蓝桥杯 算法提高 8皇后&#183;改 -- DFS 回溯

  算法提高 8皇后·改   时间限制:1.0s   内存限制:256.0MB 问题描述 规则同8皇后问题,但是棋盘上每格都有一个数字,要求八皇后所在格子数字之和最大. 输入格式 一个8*8的棋盘. 输出格式 所能得到的最大数字和 样例输入 1 2 3 4 5 6 7 89 10 11 12 13 14 15 1617 18 19 20 21 22 23 2425 26 27 28 29 30 31 3233 34 35 36 37 38 39 4041 42 43 44 45 46 47 48

hduoj2553——N皇后问题,dfs回溯

hduoj 2553  dfs,回溯 N皇后问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 10297    Accepted Submission(s): 4634 Problem Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的