八皇后算法 - Go语言中文社区

八皇后算法


如下代码只能用g++编译,gcc不能编译。

每一行只能放一个皇后的约束条件:

1.同列两个皇后【if(甲皇后所在列==乙皇后所在列)返回 0;】

2.主对角线两个皇后【if((甲皇后所在行+列)==(乙皇后所在行+列))返回 0;】

3.副对角线两个皇后【if((甲皇后所在行-列)==(乙皇后所在行-列))返回 0;】

4.合并1. 2.条件为【if  绝对值(甲皇后所在行-乙皇后所在行)==  绝对值(甲皇后所在列-乙皇后所在列)返回 0;】

直观八皇后问题解之一如下图:

 

#include<iostream>
using namespace std;
static int chessboardQueen[8] = { 0 }, nCount = 0;   

// nCount for counting all solutions
// chessboardQueen[] 这个数组来每行储存皇后的位置
// 比如chessboardQueen[3] =5,第四行在第六这个位置是皇后

void print()//输出每一种情况下棋盘中皇后的摆放情况
{
	for (int i = 0; i < 8; i++)
	{
		int inner;
		for (inner = 0; inner < chessboardQueen[i]; ++inner)
			cout << "0"; // 0 for empty position
		cout << "*"; // * for queen's position
		for (inner = chessboardQueen[i] + 1; inner < 8; ++inner)
			cout << "0";
		cout << endl; // change to next line
	}
	cout << "==========================n";
}

/*Insure no two queens share the same row, column, or diagonal

*/
int iSafePosition(int loop, int value)
{
	int index;
	int data;
	for (index = 0; index < loop; ++index)
	{
		data = chessboardQueen[index];
		// 同一列有两个皇后
		if (value == data)  
			return 0;
		//主对角线有两个皇后
		if ((index + data) == (loop + value)) 
			return 0;
		//副对角线有两个皇后
		if ((index - data) == (loop - value))
			return 0;
	}
	return 1;
}
void eightQueen(int index)
{
	int loop;
	for (loop = 0; loop < 8; ++loop) //++loop的效率比loop++效率高
	{
		if (iSafePosition(index, loop))
		{
			chessboardQueen[index] = loop;
			if (7 == index) // 如果index等于7则说明已经成功从第一行遍历到第八行了
			{
				nCount++, print(); // 计数并输出这种情形
				chessboardQueen[index] = 0;
				return;
			}
			eightQueen(index + 1); // 递归调用
			chessboardQueen[index] = 0; // 下一行的第一列开始寻找
			                            
		}
	}
}
int main()
{
	eightQueen(0); //先从第一行摆放皇后
		cout << "total=" << nCount << endl;
	getchar(); // 解决vs运行成功一闪而过
	return 0;
}

 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/Anakinami0/article/details/92850259
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-06-27 22:08:20
  • 阅读 ( 1270 )
  • 分类:算法

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢