c_cpp 在n×n的格的棋盘上放置彼此不受攻击的Ñ个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子.N后问题等价于在n×n的格的棋盘上放

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 在n×n的格的棋盘上放置彼此不受攻击的Ñ个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子.N后问题等价于在n×n的格的棋盘上放相关的知识,希望对你有一定的参考价值。

//n后问题 回溯法计算 递归
#include "stdafx.h"
#include <iostream>
#include "math.h"
using namespace std; 
 
class Queen
{
   friend int nQueen(int);
   private:
      bool Place(int k);
	  void Backtrack(int t);
      int  n,    // 皇后个数
          *x;    // 当前解
      long sum;  // 当前已找到的可行方案数  
}; 
 
int main()
{
	int n=4,m;
	cout<<n<<"皇后问题的解为:"<<endl;
	m=nQueen(n);
    cout<<n<<"皇后问题共有";
	cout<<m<<"个不同的解!"<<endl;
	return 0;
}
 
bool Queen::Place(int k)
{
	for (int j=1;j<k;j++)
	{
		if ((abs(k-j)==abs(x[j]-x[k]))||(x[j]==x[k])) 
		{
			return false;
		}
	}
	return true;
} 
 
void Queen::Backtrack(int t)//t扩展的是行
{
	if (t>n)
	{
		sum++;
		for (int i=1;i<=n;i++)
		{
		    cout<<x[i]<<" ";
		}
		cout<<endl;
	}
	else
	{
		//探索第t行的每一列是否有元素满足要求
		for (int i=1;i<=n;i++)
		{
			x[t]=i;
			if (Place(t))
			{
				Backtrack(t+1);
			}
		}
	}
 }
 
int nQueen(int n)
{
	Queen X;
	X.n=n;
	X.sum=0;
 
	int *p=new int[n+1];
 
	for(int i=0;i<=n;i++)
	{
		p[i]=0;
	}
 
	X.x=p;
	X.Backtrack(1);
 
	delete []p;
	return X.sum;
}
//n后问题 回溯法计算 迭代
#include "stdafx.h"
#include <iostream>
#include "math.h"
using namespace std; 
 
class Queen
{
   friend int nQueen(int);
   private:
      bool Place(int k);
	  void Backtrack(void);
      int  n,    // 皇后个数
          *x;    // 当前解
      long sum;  // 当前已找到的可行方案数  
}; 
 
int main()
{
	int n=4,m;
	cout<<n<<"皇后问题的解为:"<<endl;
	m=nQueen(n);
    cout<<n<<"皇后问题共有";
	cout<<m<<"个不同的解!"<<endl;
	return 0;
}
 
bool Queen::Place(int k)
{
	for (int j=1;j<k;j++)
	{
		if ((abs(k-j)==abs(x[j]-x[k]))||(x[j]==x[k])) 
		{
			return false;
		}
	}
	return true;
} 
 
void Queen::Backtrack()
{
	x[1] = 0;
	int k = 1;
	while(k>0)
	{
		x[k] += 1;
		while((x[k]<=n)&&!(Place(k)))//寻找能够放置皇后的位置
		{
			x[k] += 1;
		}
 
		if(x[k]<=n)//找到位置
		{
			if(k == n)
			{
				for (int i=1;i<=n;i++)
				{
					cout<<x[i]<<" ";
				}
				cout<<endl;
				sum++;
			}
			else
			{
				k++;
				x[k]=0;
			}
		}
		else
		{
			k--;
		}
	}
 }
 
int nQueen(int n)
{
	Queen X;
	X.n=n;
	X.sum=0;
 
	int *p=new int[n+1];
 
	for(int i=0;i<=n;i++)
	{
		p[i]=0;
	}
 
	X.x=p;
	X.Backtrack();
 
	delete []p;
	return X.sum;
}

以上是关于c_cpp 在n×n的格的棋盘上放置彼此不受攻击的Ñ个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子.N后问题等价于在n×n的格的棋盘上放的主要内容,如果未能解决你的问题,请参考以下文章

回溯算法

n皇后问题

1295 N皇后问题

codevs 1295 N皇后问题

同行列对角线的格

N皇后问题(递归回溯)