C语言DFS(6)___八皇后问题(Hdu 2612)

Problem Description

在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。

你的任务是,对于给定的N,求出有多少种合法的放置方法。

Input

共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。

Output

共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。

Sample Input

1
8
5
0

Sample Output

1
92
10

很经典的一道DFS题

直接上代码:

#include <stdio.h>
#include <iostream>
using namespace std;
int map[20],a[20],hang[20],n,cnt;
void DFS(int num)
{
int i,j,flag;
if(num==n+1)//到n也成立了才会搜索n+1
{
cnt++;return;
}
for(i=1;i<=n;i++)
if(!hang[i])//不在同一行
{
flag=1;map[num]=i;//第num列第i行放第num个皇后
for(j=1;j<num;j++)
if((map[num]-num==map[j]-j)||(map[num]+num==map[j]+j))//判断是否在对角线上
{
flag=0;break;
}
if(flag)
{
hang[i]=1;
DFS(num+1);//递归调用
hang[i]=0;
}
}
}
int main()
{
int i,m;
for(i=1;i<11;i++)//打表列出N个皇后对应几种方法
{
memset(map,0,sizeof(map));
memset(hang,0,sizeof(hang));
n=i;cnt=0;
DFS(1);
a[i]=cnt;
}
while(cin>>m&&m!=0)
cout<<a[m]<<endl;
return 0;
}
时间: 2024-07-31 20:03:33

C语言DFS(6)___八皇后问题(Hdu 2612)的相关文章

C语言DFS(7)___单词拼接(NYoj 99)

单词拼接 描述 给你一些单词,请你判断能否把它们首尾串起来串成一串. 前一个单词的结尾应该与下一个单词的道字母相同. 如 aloha dog arachnid gopher tiger rat 可以拼接成:aloha.arachnid.dog.gopher.rat.tiger 输入 第一行是一个整数N(0<N<20),表示测试数据的组数 每组测试数据的第一行是一个整数M,表示该组测试数据中有M(2<M<1000)个互不相同的单词,随后的M行,每行是一个长度不超过30的单词,单词全部

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

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

C语言学习--八皇后问题

问题描述: 在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 程序设计: 1.一维数组a[17],数组分成三段,第一段a[0]用来标记八皇后安置完成:第二段a[1,8]用来标记列位置有无子,方便判断列冲突:第三段a[9,16]用来标记存储位置. 2.关键算法 递归判断位置,eightQueens . 3.对角线位置互斥判断, isDiagonal. 4.输出函数, printResult. 算法描述: 1.首次传入为数组a

八皇后问题 OpenJ_Bailian - 2698 DFS

在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方.Input无输入.Output按给定顺序和格式输出所有八皇后问题的解(见Sample Output).Sample Input Sample Output No. 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 No. 2

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

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

八皇后(dfs+回溯)

重看了一下刘汝佳的白板书,上次写八皇后时并不是很懂,再写一次: 方法1:逐行放置皇后,然后递归: 代码: #include <bits/stdc++.h>#define MAXN 8#define ll long longusing namespace std; ll ans=0;int c[MAXN]; void dfs(int cur){    if(cur==MAXN) ans++;   //***因为是逐行放置的,所以只要走到最后一行则肯定可行    else    {       

洛谷 P1219 八皇后【经典DFS,温习搜索】

P1219 八皇后 题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 5来描述,第i个数字表示在第i行的相应位置有一个棋子,如下: 行号 1 2 3 4 5 6 列号 2 4 6 1 3 5 这只是跳棋放置的一个解.请编一个程序找出所有跳棋放置的解.并把它们以上面的序列方法输出.解按字典顺序排列.请输出前3个解.最后一行是解的总个数. //以下的

百练 2754 八皇后 (DFS)

2754:八皇后 总时间限制: 1000ms 内存限制: 65536kB 描述 会下国际象棋的人都很清楚:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题. 对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2...b8,其中bi为相应摆法中第i行皇后所处的列数.已经知道8皇后问题一共有92组解(即92个不同的皇后串). 给出一个数b,要求输出第b个串.串的比较是这样的:皇后串x置

回溯算法-C#语言解决八皇后问题的写法与优化

结合问题说方案,首先先说问题: 八皇后问题:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 嗯,这个问题已经被使用各种语言解答一万遍了,大多还是回溯法解决的. 关于回溯算法:个人理解为就是优化的穷举算法,穷举算法是指列出所有的可能情况,而回溯算法则是试探发现问题"剪枝"回退到上个节点,换一条路,能够大大提高求解效率. 具体到8皇后问题上来说,需要考虑以下几点: 1)将8个皇后定义为8行中的相对位置来标识,考虑增