AcWing 843. n-皇后问题(输出棋盘)

题目链接:点击这里

在这里插入图片描述
在这里插入图片描述

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>

using namespace std;

int n;
bool st[30];
int p[30];      // 排列

void dfs(int idx)                         // idx是行号
{
	if(idx == n + 1)                      // 递归边界,即到达了第n+1行
	{
	    for(int i = 1; i <= n; ++i)
	    {
	        for(int j = 1; j <= n; ++j)
	        {
	            if(j == p[i])   printf("Q");
	            else    printf(".");
	        }
	        puts("");
	    }
	    puts("");
		return;
	}
	
	for(int i = 1; i <= n; i++)            // 有1~n列可选
	{
		if(st[i] == false)                 // 如果第i列没有放皇后
		{
			bool flag = true;               // 则判断(idx,i)与之前的皇后(j,p[j])是否冲突
			for(int j = 1; j < idx; j++)
			{
				if(abs(idx - j) == abs(i - p[j]))
				{
					flag = false;	        // 与之前的皇后在一条对角线,冲突 
					break;
				}
			}

			if(flag)
			{
				p[idx] = i;	            // 令第idx行皇后的列号为i 
			    st[i] = true;	        // 第i列被占用
				dfs(idx + 1);		    // 递归处理第idx + 1行 
				st[i] = false;	        // 恢复现场
			}
		}
	}
}

int main()
{
    scanf("%d", &n);
    
    dfs(1);
    
	return 0;
}
发布了844 篇原创文章 · 获赞 135 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/qq_42815188/article/details/97688668