八皇后问题(递归回溯)

算法思想:

    每一行循环选取合适的位置进行放置,若成功则递归进行下一行,若该行所有位置皆不满足,则返回至上一行。

代码:

#include <iostream>
#include <math.h>
#define N 8
using namespace std;

void print();
bool check(int n);
void solution(int i);

int s[N];		// 记录每行的摆放位置 
int sum = 0;	// 计数 

int main()
{
	solution(0);
	cout << "sum = " << sum; 
	return 0;
}

void print()	// 打印输出
{    
	for(int i = 0; i < N; ++i)
    {
        for(int j = 0; j < N; ++j)
        {
            if(j == s[i])
                cout << "1";
            else
                cout << "0";
        }
        cout << endl;
    }
    cout << endl;
}

void solution(int i)
{
	if(i == N)		// 最后一行成功放置 
	{
		print();
		++sum;
		return;
	}
	
	for(int k = 0; k < N; ++k)	// 遍历该行能进行放置的位置 
	{
		s[i] = k;
		if(check(i))
			solution(i+1);
	}
}

bool check(int n)
{
    for(int i = 0; i < n; ++i)
    {
        if(s[i] == s[n])		// 列判断 
            return false;
        if(abs(s[n] - s[i]) == n - i)	// 对角线判断 
            return false;
    }
    return true;
}


猜你喜欢

转载自blog.csdn.net/adorkable_thief/article/details/80164846
今日推荐