2021-01-30

n皇后问题

题目链接
问题描述:
n-皇后问题是指将 n 个皇后放在 n∗n 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。
2021-01-30_第1张图片
输入格式: 输一个n(1<=n<=9),代表棋盘尺寸。
输出格式:每个解决方案占n行,每行输出一个长度为n的字符串。
其中”.”表示某一个位置的方格状态为空,”Q”表示某一个位置的方格上摆着皇后。
每组输出顺序任意,保证不重不漏。
每个方案输出完成后,输出一个空行。
输入样例

4

输出样例

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

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

题解:对于一条斜率为正的(shang)对角线:y=x+b,截距为b=y-x,遍历过程难免出现y 思路的话是初始化全局为‘.’(空)。初始化x=0,对每一列去顺序遍历,遇到符合条件的位置就放入Q。放入皇后’Q’的同时,标记这一列和正反对角线为true,表示在这一层循环与往下的循环中,true的地方不能再放‘Q’,然后遍历到x=n的时候代表整个棋盘遍历完成,输出即可。

#include 
using namespace std;
const int N = 25;
int n;
char pan[N][N]; //汉语拼音,形象生动   //注意下,全局变量声明bool类型,初始值为false 
bool lie[N], shang[N], xia[N];//shang是斜率为正对角线,xia是斜率为负对角线,lie是代表列 。 
void dfs(int x)//以x递增的方式深搜,全局按列搜索 
{
     
    if (x == n)//深搜出口,遍历完成,输出棋盘 
    {
     
        for (int i = 0; i < n; i ++ ) 
	    {
     
	   	 	for(int j=0;j<n;j++)
				{
     
					printf("%c",pan[i][j]);
				 } 
		 	printf("\n");
	     }    
	     printf("\n");//每个样例输出一个回车 
        return;
    }

    for (int i = 0; i < n; i ++ )//对某一列,按行搜索 
        if (!lie[i] && !xia[x + i] && !shang[n - x + i]) //三个false 为合法  
        {
     
            pan[x][i] = 'Q';
            lie[i] = xia[x + i] = shang[n - x + i] = true;//标记 
            dfs(x + 1);
            lie[i] = xia[x + i] = shang[n - x + i] = false;//恢复上一层初态 
            pan[x][i] = '.';

        }
}

int main()
{
     
    cin >> n;
    for (int i = 0; i < n; i ++ )
        for (int j = 0; j < n; j ++ )
            pan[i][j] = '.';//把棋盘初始化为空 
    dfs(0);
    return 0;
}   


类似题解:棋盘问题
棋盘挑战【DFS】

你可能感兴趣的:(笔记,c++,dfs,动态规划,算法)