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

📄 014.cpp

📁 包含两个文件
💻 CPP
字号:
/* 
算法思想:用一个n个int形的数组来作为棋盘的X坐标,同时这个数组本身的位置就代表Y坐标。
用一个布尔形的数据来判断这个点是否会跟其他点参生冲突。这样逐行的寻找可以放置的坐标,直到N-1行
如果能找到N-1行的不冲突点,则就找到了一个结果。 如果N为偶数,则在寻找过程中,只需要寻找第一行X
坐标0至n/2的结果就可以了,因为他们是对称的,所以只要将0至n/2的结果乘2就可以得出总共的结果。
如果N是奇数,则寻找第一行X坐标0至n/2的结果乘2,然后还要加上n/2+1的结果,就可以求出总共的结果。
*/
#include <iostream.h>
#include <time.h>
typedef struct 
{ 
bool use;
int x;
} QueenN;
void initQueenN(QueenN *p, int n);
void main()
{
clock_t start_time,end_time;
int n, result = 0, YOld, y, k, odd = 0, JudgeN = 0, answer = 0, judge = 0, JudgeO = 0; 
QueenN *p;
cout<<"请输入N皇后问题的N:"<<endl;
cin>>n;
cout<<"\n";
JudgeN = n / 2;
odd = n % 2;//判断N是奇数还是偶数
p = new QueenN [n];
start_time=clock();
initQueenN(p,n);// 初始化n
while (p[0].x<JudgeN) 
{
	for (k=1; k<n; k++) //将第二行以上的数据都清零
	{
		p[k].x = 0;
		p[k].use = false;
	} 
	y = 1;
	while (p[1].x < n)//对第二行以上进行循环
	{
		YOld = y - 1;
		while ((p[y].x<n)&&(YOld>=0)) // 对具体一行进行循环
		{
			if ((p[y].x != p[YOld].x)&&(p[y].x != (p[YOld].x + (y - YOld)))&&(p[y].x != (p[YOld].x - (y - YOld)))) //判断具体一行的具体位置对于其下的所有行位置是否可用
			{
			p[y].use = true;
			}
			else 
			{
				p[y].use = false; 
				p[y].x++;
				YOld = y - 1;
			}
		if (p[y].use == true) YOld--;
		}
		if ((p[n-1].use == true)&&(YOld == -1)) // 最高行找到一个可放位置
		{
			result++;
			p[n-1].use = false;
		}
				
		if (YOld == -1) // 某行找到一个可用位置
		{
			y++;
			if (y==n)  
			{
				y--;
				p[y].x++;
			}
			else
				p[y].x = 0;
			
		}	
		if ((p[y].x == n) && (p[1].x != n)) //高于第二行的某行找完
		{
			p[y].x = 0;
			y--;
			p[y].x++;
		}
						
	}
	p[0].x++;
}
result = result * 2; //实现翻倍
answer = answer + result;
result = 0;
if (odd > 0)  // 是奇数则在查找一次结果
{
	for (k=1; k<n; k++) 
	{
		p[k].x = 0;
		p[k].use = false;
	}
	y = 1;
	while (p[1].x < n)
	{
		YOld = y - 1;
		while ((p[y].x<n)&&(YOld>=0))
		{
			if ((p[y].x != p[YOld].x)&&(p[y].x != (p[YOld].x + (y - YOld)))&&(p[y].x != (p[YOld].x - (y - YOld))))
			{
			p[y].use = true;
			}
			else 
			{
				p[y].use = false; 
				p[y].x++;
				YOld = y - 1;
			}
		if (p[y].use == true) YOld--;
		}
		if ((p[n-1].use == true)&&(YOld == -1)) 
		{
			result++;
			p[n-1].use = false;
		}
				
		if (YOld == -1)
		{
			y++;
			if (y==n)  
			{
				y--;
				p[y].x++;
			}
			else
				p[y].x = 0;
			
		}	
		if ((p[y].x == n) && (p[1].x != n))
		{
			p[y].x = 0;
			y--;
			p[y].x++;
		}
						
	}

}
answer = answer + result;

end_time=clock();
cout<<"生成"<<n<<"皇后共用"<<end_time-start_time<<"毫秒"<<endl;
cout<<n<<"皇后共有结果"<<answer<<"个解."<<endl;
}

void initQueenN(QueenN *p, int n)
{
int i;
for (i=0; i<n; i++) 
{
	p[i].use = false;
	p[i].x = 0;
}
}

⌨️ 快捷键说明

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