https://vjudge.net/problem/OpenJ_Bailian-2754
这道题自己先写了一次,然后看了一下PKU郭炜老师的题解logn,觉得真的是相形见绌,在此就把郭炜老师的代码放一下吧。。。
首先是在棋盘中发现了一些规律:两个皇后行的差绝对值和列的差的绝对值相同或在同一列就说明可以吃到
然后直接用row[i]来表示i行的皇后放在row[i]列,直接一个循环就可以解决了,而且隐含了回溯算法
#include<cmath>
#include<iostream>
using namespace std;
int q[92][8], row[8], num = 0;
void queen(int i)
{ //把皇后放在第i列
int j, k; //产生一组新解
if(i == 8){
for(j = 0; j < 8; j++)
q[num][j] = row[j];
num++;
return;
}
for(int j = 1; j <= 8; j++){
//将当前皇后逐一尝试放在不同的列,每列对应一组解
for(k = 0; k < i; k++)
if(row[k] == j || abs(k-i) == abs(row[k]-j)) break; //判断是否冲突
if(k == i){
row[k] = j; //放置新皇后
queen(i+1);
}
}
}
int main()
{
int n, i, b, j;
queen(0);
cin >> n;
for(i = 0; i < n; i++){
cin>>b;
for(int j = 0; j < 8; j++)
cout << q[b-1][j];
cout << endl;
}
return 0;
}