N皇后问题:(dfs)

1.按行处理:逐列放置皇后

2.按规则进行:放置下一行的皇后

3.当放置皇后达到要求,输出皇后棋盘

N皇后问题:(dfs)_第1张图片

#include 
#include 
using namespace std;
int n;
int c=0;
bool place(int x[], int k) {
    for (int i = 1; i < k; ++i)
        if (x[i] == x[k]/*同一列*/ || (abs(x[i] - x[k]) == abs(i - k))/*对角线*/) return false;
    return true;
}

void print(int x[])
{
	for(int i=1;i <= n;i++)
	{
		for(int j=1;j <= n;j++)
		{
			if(j == x[i])
			{
				cout << '1' << ' ';
				continue;
			}
			cout << '0' << ' ';
		}
		cout << endl;
	}
} 

void n_queens(int k, int x[]) {
    if (k > n) {
        //for (int i = 1; i <= n; ++i) cout << x[i] << " ";
        //cout << endl;
        c++;
        cout << "第" << c << "种放法:" << endl; ;
        print(x);
    }
    else {
        for (int i = 1; i <= n; ++i) {
            x[k] = i;
            if (place(x, k)) n_queens(k + 1, x);//处理第k+1行 
        }
    }
}
int main() {
    cin >> n;
    int *x = new int[n+1];
    n_queens(1, x);//处理第一行 
//    cout << c << endl;
    delete[]x;
	return 0;
}

 

你可能感兴趣的:(基础算法)