求解高斯8皇后问题

算法设计:
高斯八后问题的一个解用一个八位数表示,八位数解的第k个数字为j,表示棋盘上的第k行的第j格放置一个皇后。
因而解的范围区间应为[12345678,87654321]。因而穷举a循环的穷举范围定为[12345678,87654321]
两个皇后不允许处在同一横排,同一纵列,要求八位数中数字1—8各出现一次,不能重复。设置数组f(x),统计数字x的个数,若f(1)~ f(8)均等于1则1~8均出现1次,否则返回测试下一个8位数a
任意两皇后不允许出现在同一与棋盘成45度角的斜线上,设置数组g(k),若a的第k个数字为x,则 g(k)=x。,要求解得8位数的第j个数字与第k个数字的绝对值不等于j-k, 若出现|g(j)-g(k)|=|j-k|,表明j 与k,出现同处在45度角斜线上,则返回测试下一个8位数a
在穷举范围内均通过上两道筛选的8位数即为一个解,打印输出即可,
用变量s统计解得个数

#include<iostream>
#include <cmath> 
using namespace std;

int main()
{
	/*
	s:	记录8皇后问题成立的个数
	k: 	行
	i: 	计数
	j: 	计数
	t: 	标志,用于标记是否有”冲突“
	x: 	某列
	f[]:某列的个数
	g[k]:第k行上皇后的列值
	a:	8皇后成立时组成的数值
	y:	 暂存a的值,即每种可能的情况 
	*/ 
	int s, k, i, j, t, x, f[9], g[9];
	long a, y;
	s = 0;
	cout << "高斯8皇后问题的解为:" << endl;
	
	for (a = 12345678; a <= 87654321; a = a + 9) //逐个遍历 
	{
		y = a;
		k = 0;
		for (i = 1; i <= 8; i++)				//将f数组置为0 
			f[i] = 0;
		while (y > 0)								 
		{
			x = y % 10;
			f[x]++;								//记录某行纵向填数的个数 
			y /= 10;
			k++;
			g[k] = x; 
		} 
		for (t = 0, i = 1; i <= 8; i++)			//数字1--8出现次数不为1,返回 
		{
			if (f[i] != 1)
				t = 1; 
		} 
		if (t == 1)								//如果f[i] != 1,则返回 
			continue;
		for (k = 1; k <= 7; k++) 				//比较45度角上是否含有“冲突” 
		{
			for (j = k +1; j <= 8; j++)
			{
				if(fabs(g[j]-g[k])== j-k)
					t = 1; 
			} 
		} 
		if (t == 1)								//有冲突则返回 
			continue;
		s++;									//总个数计数 
		cout << a << "  " ;
	 	if (s % 6 == 0)							//打印限制 
		 	cout << endl ; 
	} 
	cout <<"\n总个数有" << s << "个" << endl; 
	
	return 0;
}
/*==========运行结果============
高斯8皇后问题的解为:
15863724  16837425  17468253  17582463  24683175  25713864
25741863  26174835  26831475  27368514  27581463  28613574
31758246  35281746  35286471  35714286  35841726  36258174
36271485  36275184  36418572  36428571  36814752  36815724
36824175  37285146  37286415  38471625  41582736  41586372
42586137  42736815  42736851  42751863  42857136  42861357
46152837  46827135  46831752  47185263  47382516  47526138
47531682  48136275  48157263  48531726  51468273  51842736
51863724  52468317  52473861  52617483  52814736  53168247
53172864  53847162  57138642  57142863  57248136  57263148
57263184  57413862  58413627  58417263  61528374  62713584
62714853  63175824  63184275  63185247  63571428  63581427
63724815  63728514  63741825  64158273  64285713  64713528
64718253  68241753  71386425  72418536  72631485  73168524
73825164  74258136  74286135  75316824  82417536  82531746
83162574  84136275
总个数有92个
请按任意键继续. . .
*/




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值