⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eight_queen.cpp

📁 n皇后问题
💻 CPP
字号:
// eight_queen.cpp : Defines the entry point for the console application.

#include <math.h>
#include <windows.h>
#include <iostream.h>
const int MaxN=32;               //规定问题为8皇后问题
int   num_n;                 //记录数组中接点的个数,如果=N则位置分配成功
long  count=0;               //记录N皇后问题的解的个数
struct Node
{
	int row;
	int col;
}Judge[MaxN];                   //记录分配成功的位置
       
int  Accord(int row,int col) //判断位置是否符合
{
	int i;
	for(i=0;i<num_n;i++)
		if( Judge[i].col==col||abs(Judge[i].row-row)==abs(Judge[i].col-col))
			  //新加入的位置不能与已存在的位置1.同行2.同列3.对角线,满足任一条则不符合
			return 0;
	return 1;                          //可以插入到位置数组Judge[N]中
}
void main()
{
	cout<<"********************************N皇后问题*************************(作者:吴限福)"<<endl;

loop1:
	count=0;
	int i=0,j,k,w,sleep,N;                     //循环变量
	int sign=0,sign1=0,sign2=0;        //sign 和sign1配合标记插入成功时跳转位置
                                       //sign2标记至少找到一个解	
	cout<<"                         "<<"输入皇后个数(0退出程序)      ";
	cin>>N;
	if(N==0)
		return;
	cout<<"                         "<<"输入1---------延时显示路径"<<endl;
	cout<<"                         "<<"输入2---------非延时看结果"<<endl;
	cout<<"                                 请选择 ";
	cin>>sleep;
	while(i<N&&N!=1)
	{
		Judge[0].row=0;
		Judge[0].col=i;
		if(sleep==1)
		    cout<<Judge[0].row<<"-----"<<i<<endl;
		num_n=1;
		k=-1 ;                          //从第1行,第i列开始则查找从第2行第1列开始。
        j=1;
	    while(j<N)
		{
			while(k<N)
			{
				k++;
				if(Accord(j,k)==1&&k<N) //第J+1行。第K+1列若符合,插入到Judge[]中
				{
					num_n++;
					Judge[num_n-1].row=j;
					Judge[num_n-1].col=k;
					if(sleep==1)
					    cout<<j<<"--s--"<<k<<endl;   //输出当前位置(已符合)
					if(num_n==N)                 //找到一个解,则
					{
			            if(sleep==1)
							for(w=0;w<N;w++)
				                cout<<N<<"皇后问题找到位置: 行"<<Judge[w].row+1<<"列:"<<Judge[w].col+1<<endl;
						if(sleep==1)
						    Sleep(1000);
						sign2=1;						
			            count++;                 //count自加,
 		                k=Judge[num_n-2].col;    //且回归到位置行N-2,		
			            j=Judge[num_n-2].row;    //列Judge[N-2].col+1继续
                        num_n=num_n-2;	
						sign1=1;
					}
					if(sign1==0)
					{
						sign=1;
					    
					}
					sign1=0;
				}
				if(sign==1)           //如果插入成功(sign1=1),则进入下一行的第一列继续继续搜索
					                  //如果sign1=0,即不符合,则在同行的下一列继续搜索(循环首部k++)
				{
					sign=0;
					k=-1;
					j++;
				}			
			} 
			if(k==N)                  
			{                         //查找到第i(i<1<N)行,第N-1列仍未符合,
				                      //则回归到位置行num_n-1,列Judge[num_n-1].col+1继续
				k=Judge[num_n-1].col;		
				j=Judge[num_n-1].row;
                num_n=num_n-1;
				if(j==0)              //首位置为(0,i)的路径查找完毕,开始从首位置(0,i+1)查找
					i++;					
				if(j==0&&i==N)
				     goto loop;       //查找完毕退出循环,输出结果
			}
		}
	}
	if(N==1)
	{
		sign2=1;
		count=1;
		cout<<0<<"----"<<0<<endl;
	}
loop: ;
	if(sign2==0)
		cout<<"                         "<<N<<"皇后问题没有解!"<<endl<<endl<<endl;
	else
		cout<<"                         "<<N<<"皇后问题解个数"<<count<<endl<<endl<<endl;
	goto   loop1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -