八皇后(DFS)

题目描述

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

输入

第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数b(1 <= b <= 92)

输出

输出有n行,每行输出对应一个输入。输出应是一个正整数,是对应于b的皇后串。

样例输入

3
6
4
25

样例输出

25713864
17582463
36824175
 1 #include <stdio.h>
 2 #include <math.h>
 3
 4 int num=1;
 5 int oc[10];//记录第i路皇后的行数
 6 int book[10];//记录第i路皇后放没放
 7 int hh[100];//打表记录问题的解
 8 int m=8;//8皇后
 9
10 void make(int index)
11 {
12     if(index==m+1)
13     {
14         bool flag=true;
15         for(int i=1;i<=m;i++)
16         {
17             for(int j=i+1;j<=m;j++)
18             {
19                 if(abs(i-j)==abs(oc[i]-oc[j]))
20                 {
21                     flag=false;
22                 }
23             }
24         }
25         if(flag)
26         {
27             int q=0;
28             for(int i=1;i<=m;i++)
29             {
30                 q=q*10+oc[i];
31             }
32             hh[num++]=q;
33         }
34         return ;
35     }
36     for(int i=1;i<=m;i++)
37     {
38         if(book[i]==0)
39         {
40             oc[index]=i;
41             book[i]=1;
42             make(index+1);
43             book[i]=0;
44         }
45     }
46 }
47
48
49 int main()
50 {
51     int n;
52     scanf("%d",&n);
53     make(1);
54     while(n--)
55     {
56         int t;
57         scanf("%d",&t);
58         printf("%d\n",hh[t]);
59     }
60     return 0;
61 }

原文地址:https://www.cnblogs.com/jiamian/p/10699147.html

时间: 2024-08-02 14:50:03

八皇后(DFS)的相关文章

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

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

八皇后问题 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置

八皇后问题(DFS)

题目描述: 要在国际象棋棋盘中放八个皇后,使任意两个皇后都不能互相吃,皇后能吃同一行.同一列,同一对角线上(两个方向的对角线)的任意棋子.现在给一个整数n(n<=92),输出前n种的摆法. 输入格式: 输入一个整数n. 输出格式: 输出共n行. 每行8个数,表示每行所放的列号,每个数输出占4列. 样例输入: 3 样例输出: 1 5 8 6 3 7 2 41 6 8 3 7 4 2 5 1 7 4 6 8 2 5 3 思路:DFS,把每一个格子试一次. 提示: 确定两个棋子在不在统同一行,同一列,

深度搜索(dfs)+典型例题(八皇后)

深度优先搜索简称深搜,从起点出发,走过的点要做标记,发现有没走过的点,就随意挑一个往前走,走不了就回退,此种路径搜索策略就称为“深度优先搜索”,简称“深搜”. 如上面的图所示:加入我们要找一个从V0到V6的一条最短的路径.我们可以看到有许多的路我们可以走. V0——V3——V5——V6: V0——V3——V1——V4: V0——V3——V1——V2——V6: V0——V1——V4: V0——V1——V3——V5——V6: V0——V1——V2——V6: V0——V2——V6: 前两组,是从节点V

[OpenJudge] 百练2754 八皇后

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