八皇后问题 二维、一维、回溯

在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?

为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。

下面代码是输出所有可能的皇后排列方法 共92种

//八皇后问题 
#include
using namespace std;
int c[8],q[8][8];//q[8][8]是用来记录皇后的位置的 c[8]是用来记录着一列有没有皇后 
void dfs(int count);
bool judge(int row,int col);//用来判断斜线上有没有皇后 
int cnt=0;//记录多少种放法 
int main()
{
	dfs(0);
	cout<
bool judge(int row,int col)
{
	int i=1,j,k;
	if(c[col]){
		return false;
	}
	while((--row)>=0){
		//row--;
		if(col+i<8){
			if(q[row][col+i]){
				return false;
			}
		}
		if(col-i>=0){
			if(q[row][col-i]){
				return false;
			}
		}
		i++;
	}
	return true;
}

//用一维数组表示 c[i] = j 第i行的第j个元素是皇后  
#include
using namespace std;
int c[9],cnt=0; 
void dfs(int count);
bool judge(int row,int col);
int main(){
	dfs(1);
	cout<

//用回溯写
#include
using namespace std;
int c[9],cnt=0;
bool judge(int row,int col);
void print();
int main()
{
	int i,j,k;
	k = 1;
	c[k] = 0;
	while(k>0){
		c[k] += 1;
		while(c[k]<=8 && !judge(k,c[k])){//如果这一列不符合条件 就看下一列 
			c[k]+=1;
		}
		if(c[k]<=8){//如果这一行中有皇后 
			if(k==8){//如果到了第八行 说明全部完成  
				print();
				cnt++;
				c[k] = 0;
				k--; //回溯到上一行并且这一行的皇后复位为0
			}
			else{
				k++;//看下一行 
				c[k] = 0;
			}
		}
		else{//未找到 则回溯到上一行 
			c[k] = 0;//复位为0 
			k--;//回溯到上一行 
		}
	}
	cout<


你可能感兴趣的:(回溯,搜索类)