八皇后问题复习

八皇后问题是回溯算法的经典题目,今天把它记录下来,以后看起来方便。不理解的时候觉得很复杂,理解之后又觉得不复杂了。

C++11

#include <iostream>
#include <stdlib.h>

using namespace std;

const int EIGHT = 8;
static int count = 0;

void Queen(int queen[], int rowLeft)
{
    if (0 == rowLeft)//放置完成,计数加1
    {
        count++;
    }
    else
    {
        for (int i=0; i<EIGHT; ++i) //一共8列,尝试在每一列放置
        {
            auto curRow = EIGHT - rowLeft;
            queen[curRow] = i;
            auto couldPut = [](int queen[], int curRow) {
                for (int i=0; i<curRow; ++i)
                {   //皇后不能在同一行,同一列,或者同一斜线上。因为每一行分别存储,所有不用判断行
                    if ( (queen[i] == queen[curRow]) || (curRow - i) == (queen[curRow] - queen[i]) || (queen[curRow] + curRow) == (queen[i] + i))
                    {
                        return false;
                    }
                }
                return true;
            };
            if (couldPut(queen, curRow))//判断该位置是否可以放置。若不能放置,进入下一个for循环放置,相当于回退到上一步,重新找位置放置。
            {
                Queen(queen, rowLeft-1);//放置下一行
            }
        }
    }
}

int main()
{
    int Queens[EIGHT] = {0};    //数组存储每行皇后所在列位置
    Queen(Queens, EIGHT);

    cout<<count<<endl;
    system("pause");
    return 0;
}

C++

#include "stdafx.h"
#include <iostream>
#include <stdlib.h>

using namespace std;

const int EIGHT = 8;
int count = 0;
int Queens[EIGHT] = {0};
bool Check(int queen[], int curRow)
{
	for (int i=0; i<curRow; ++i)
	{
		if ( (queen[i] == queen[curRow]) || (curRow - i) == (queen[curRow] - queen[i]) || (queen[curRow] + curRow) == (queen[i] + i))
		{
			return false;
		}
	}
	return true;
}

void Queen(int queen[], int rowLeft)
{
	if (0 == rowLeft)
	{
		count++; 
	}
	else
	{
		for (int i=0; i<EIGHT; ++i)
		{
			queen[EIGHT - rowLeft] = i;
			if (Check(queen, EIGHT - rowLeft))
			{
				Queen(queen, rowLeft-1);
			}
		}
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	Queen(Queens, EIGHT);
	cout<<count<<endl;
	system("pause");
	return 0;
}

python:

EIGHT = 8
count = 0
Queens = [0,0,0,0,0,0,0,0]
def Check(queen, curRow):
    for i in range(curRow):
        if (queen[i] == queen[curRow]) or (curRow - i) == (queen[curRow] - queen[i]) or (queen[curRow] + curRow) == (queen[i] + i):
            return False
    return True

def Queen(queen, rowLeft):
    global count
    if 0 == rowLeft:
        count = count + 1
    else:
        for i in range(EIGHT):
            queen[EIGHT - rowLeft] = i
            if Check(queen, EIGHT - rowLeft) == True:
                Queen(queen, rowLeft-1)
    pass


def main():
    Queen(Queens, EIGHT)
    print('eight queen number: ' + str(count))


if __name__ == '__main__':
    main()

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值