算法设计:
高斯八后问题的一个解用一个八位数表示,八位数解的第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个
请按任意键继续. . .
*/