• 八皇后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;
    }
    

      

  • 相关阅读:
    主席树学习笔记(静态区间第k大)
    p1156 题解(未完全解决)
    树上神奇 逆 逆序对(我的叫法)hh的小纸条 重中之重!!!!!
    二叉查找树学习笔记(BST)
    负环...坑点
    差分约束系统学习笔记
    tarjan学习(复习)笔记(持续更新)(各类找环模板)
    分层图食用简介
    js数组方法
    灵动标签调用父栏目下的所有文章
  • 原文地址:https://www.cnblogs.com/workharder/p/12143344.html
Copyright © 2020-2023  润新知