843. n-皇后问题(dfs+输出各种情况)

n-皇后问题是指将 n 个皇后放在 n∗n 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。

现在给定整数n,请你输出所有的满足条件的棋子摆法。

输入格式

共一行,包含整数n。

输出格式

每个解决方案占n行,每行输出一个长度为n的字符串,用来表示完整的棋盘状态。

其中”.”表示某一个位置的方格状态为空,”Q”表示某一个位置的方格上摆着皇后。

每个方案输出完成后,输出一个空行。

数据范围

1≤n≤91≤n≤9

输入样例:

4

输出样例:

.Q..
...Q
Q...
..Q.

..Q.
Q...
...Q
.Q..

代码:
import java.util.Scanner;

public class Main{
        static int n;
        static final int N=10;
        static int a[]=new int[N];
        static char map[][]=new char[N][N];
        static boolean check(int t){
                for(int i=0;i<t;i++)
                    if(a[i]==a[t] || Math.abs(i-t)==Math.abs(a[i]-a[t]))
                        return false;
                return true;
        }
        static void dfs(int t){
                       if(t==n){                   //因为开的字符数组大小为N,实际输出可不是N,所以两重循环输出
                                for(int i=0;i<n;i++) {
                                    for(int j=0;j<n;j++)
                                        System.out.print(map[i][j]);
                                    System.out.println();
                                }
                                System.out.println();
                       }
                       for(int i=0;i<n;i++){
                                 a[t]=i;
                                 if(check(t)) {
                                     map[t][i]=‘Q‘;
                                     dfs(t+1);
                                     map[t][i]=‘.‘;
                                 }
                       }
        }
        public static void main(String[] args) {
                Scanner scan=new Scanner(System.in);
                n=scan.nextInt();
                for(int i=0;i<n;i++)
                    for(int j=0;j<n;j++)
                        map[i][j]=‘.‘;
                dfs(0);
        }
}

 

原文地址:https://www.cnblogs.com/qdu-lkc/p/12240886.html

时间: 2024-08-01 01:16:01

843. n-皇后问题(dfs+输出各种情况)的相关文章

poj 2400 Supervisor, Supervisee KM求二分图+dfs输出所有解

题意: 有n个Supervisor和Supervisee,他们之间相互有一个评分,现在要求一个匹配,所有人的评分和最小,并输出使评分和最小的所有匹配方案. 分析: KM算法求二分图的最小权匹配,并用dfs输出所有方案. 代码: //poj 2400 //sep9 #include <iostream> using namespace std; const int maxN=16; char g[maxN][maxN]; int mx[maxN],my[maxN],hx[maxN],hy[max

【UVA】247 - Calling Circles(floyd判断包闭,dfs输出)

最近状态不佳,总是爱犯低级错误,比较水的题,没什么需要讲得,要说的可能是floyd判断包闭吧 void Floyd() { for(int k=1; k<=n; k++) for(int i=1; i<=n; i++) if(map[i][k]) for(int j=1; j<=n; j++) if(map[k][j]) map[i][j] = 1; } 之前做了不少图论,图论周感觉能应付的过去. 14059727 247 Calling Circles Accepted C++ 0.0

HDU 1160(两个值的LIS,需dfs输出路径)

传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1160 FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 20100    Accepted Submission(s): 8909Special Judge Problem Description FatMou

蓝桥杯 算法提高 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

百练 2754 八皇后 (DFS)

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

皇后问题(DFS)(位运算)

皇后问题 题目描述: 有一个n*n的棋盘,你要在这个棋盘上放上n个皇后,使得她们不能相互攻击.当然为了使得问题更加有趣,我们在棋盘上限定了一些位置使得这些位置上不能放皇后. 输入格式: 第一行两个数n和m ,表示在一个n*n的棋盘上放n个皇后,有m个受限位置. 接下来m行每行两个数,x和y,表示第x行,第y列这个位置不可以放皇后. 输出格式: 一行一个数 ans,表示总的方案数. 样例输入: 4 1 1 2 样例输出: 1 朴素算法(60分) #include<iostream> using

[HDU2553]N皇后问题(DFS)

题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2553 题意 n<=10,输出N皇后问题的方法数. 题解 可以使用各种方法.这里使用DFS. 使用一维数组存储棋子位置.col[i]=j表示第i行的棋子放置在j列. 由于n<=10,打表10个结果在数组中即可. dfs(row)表示放置第row层(从0记)的棋子.dfs return条件是到了第n层,此时方法数++; 代码 import java.util.Scanner; public class

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,求出

UVA 247 电话圈 (floyd传递闭包 + dfs输出连通分量)

题意:输出所有的环: 思路:数据比较小,用三层循环的floyd传递闭包(即两条路通为1,不通为0,如果在一个环中,环中的所有点能互相连通),输出路径用dfs,递归还没有出现过的点(vis),输出并递归该点与其他点能互达的点: 1 #include <cstdio> 2 #include <vector> 3 #include <string> 4 #include <cstring> 5 #include <iostream> 6 using n