八皇后8皇后,探讨最效率的算法。

数据结构与算法之美|极客时间,里边的课程,关于八皇后的问题。我喜欢先说结果,然后带着疑问去学习。结果:我感觉我的效率比老师的快百分之50,也许老师的只是想让我们易读懂。

哪位大神觉得自己效率高的贴在留言区,我们要互相学习,才能进步~

结果截图:

老师的代码如下:

int nTotal2 = 0;
int result2[8] = {0};
bool isOk(int row, int column) {//判断row行column列放置是否合适
	int leftup = column - 1, rightup = column + 1;
	for (int i = row-1; i >= 0; --i) { // 逐行往上考察每一行
		if (result2[i] == column) return false; // 第i行的column列有棋子吗?
		if (leftup >= 0) { // 考察左上对角线:第i行leftup列有棋子吗?
			if (result2[i] == leftup) return false;
		}
		if (rightup < 8) { // 考察右上对角线:第i行rightup列有棋子吗?
			if (result2[i] == rightup) return false;
		}
		--leftup; ++rightup;
	}
	return true;
}
void cal8queens(int row) {
	if (row == 8) { // 8个棋子都放置好了,打印结果
		++nTotal2;
		return; // 8行棋子都放好了,已经没法再往下递归了,所以就return
	}
	for (int column = 0; column < 8; ++column) { // 每一行都有8中放法
		if (isOk(row, column)) { // 有些放法不满足要求
			result2[row] = column; // 第row行的棋子放到了column列
			cal8queens(row+1); // 考察下一行
		}
	}
}

我的代码:

const int MaxLen = 8;
int nTotal1 = 0;
int result1[8] = {0};
void EnterNextLayer(int nNextX)
{
	if (nNextX == MaxLen)
	{
		++nTotal1;
		return;
	}
	//开始判断nNextX层
	bool bEnterNext = true;
	for (int nLegalY = 0; nLegalY < MaxLen; ++nLegalY)
	{
		bEnterNext = true;
		for (int i = 0; i < nNextX; ++i)
		{
			if(i == nNextX
				|| result1[i] == nLegalY
				|| (i - result1[i]) == (nNextX - nLegalY)
				|| (i + result1[i]) == (nNextX + nLegalY))
			{
				bEnterNext = false;
				break;
			}
		}
		if (bEnterNext)
		{
			result1[nNextX] = nLegalY;
			EnterNextLayer(nNextX + 1);
		}
	}
}

  

测试效率代码:

#include <iostream>
#include <time.h>
#include <math.h>
int main()
{
	clock_t start,finish;
	start=clock();
	for (int i = 0;i<100;++i)
	{
		nTotal1 = 0;
		EnterNextLayer(0);
		//std::cout<<nTotal1<<std::endl;
	}
	finish=clock();
	std::cout<<"
方法1的运行时间为"<<(double)(finish-start)/CLOCKS_PER_SEC<<"秒!"<<std::endl;

	start=clock();
	for (int i = 0;i<100;++i)
	{
		nTotal2 = 0;
		cal8queens(0);
	}
	finish=clock();
	std::cout<<"
方法2的运行时间为"<<(double)(finish-start)/CLOCKS_PER_SEC<<"秒!"<<std::endl;

	return 0;
}

  

原文地址:https://www.cnblogs.com/workharder/p/12143344.html