n皇后问题——深度优先搜索dfs

 

dfs在之前也有讲过,有兴趣可以戳蓝字->dfs全排列

我们先画图模拟下过程吧(电脑画图不太会,手绘将就一下吧)

条件满足 

条件:任意两个皇后都不能处于同一行、同一列或同一斜线上

处理:

同一行:每次放完Q就处理下一行

同一列:用line[l]做标记

同一斜线:Q不放在dg[n-l+r] 和udg[l+r]

代码演示:

#include<iostream>
 
 using namespace std;
 
 const int N=10;
 //标记两条斜线上和列上对应的点是否有皇后 
 int dg[2*N],udg[2*N],line[N],n;
 char a[N][N];//用二维数组表棋盘 
 void dfs(int r)
 {
 	if(r==n)
 	{
 		for(int i=0;i<n;i++)
	 {
	 	for(int j=0;j<n;j++)
	 	{
	 		cout<<a[i][j];
		 }
		 cout<<endl;
	  } 
	  cout<<endl;
	  return; 
	 }
	 for(int l=0;l<n;l++)
	 {
	 	if(!dg[n-l+r]&&!udg[l+r]&&!line[l])
	 	{
	 		a[r][l]='Q';
	 		dg[n-l+r]=udg[l+r]=line[l]=1;
			 //标记对应的斜线和列上已经有了皇后 
			 dfs(r+1);//到下一行 
			 dg[n-l+r]=udg[l+r]=line[l]=0;//清除标记
			 a[r][l]='.';//重置棋盘 
		 }
	 }
 }
 int main()
 {
 	cin>>n;
 	for(int i=0;i<n;i++)
	 {
	 	for(int j=0;j<n;j++)
	 	{
	 		a[i][j]='.';
		 }
	  } 
	  dfs(0);
	  return 0;
 }

猜你喜欢

转载自blog.csdn.net/GANTENJ/article/details/123164543