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