N 皇后问题
题解:首先应该意识到,在棋盘(二维数组)中,同一条主对角线(左上到右下)上的点的 y-x 值相等,同一条副对角线(右上到左下)上的点的 x+y 值相等。用二维数组 vis 判断当前尝试的皇后所在列和两个对角线是否已存在其他皇后。主对角线 y-x 可能为负,加 n 即可。
void search(int cur){ //当前行
if(cur == n){
ans++;
return;
}
for(int i = 0; i < n; i++){
if(!vis[0][i] && !vis[1][cur+i] && !vis[2][cur-i+n]){ //分别代表列、副对角线、主对角线
//C[cur] = i; 若不需打印解 可忽略C数组
vis[0][i] = vis[1][cur+i] = vis[2][cur-i+n] = 1;
search(cur+1);
vis[0][i] = vis[1][cur+i] = vis[2][cur-i+n] = 0;
}
}
}
HDU 这题直接交会超时,可能有重复数据,因为只有 10 个数,把答案打表一下就行了。
#include <iostream>
using namespace std;
int n=1,x[11]={0,1,0,0,2,10,4,40,92,352,724};
int main(){
while(n!=0){
cin >> n;
if(n!=0) cout << x[n] << endl;
}
return 0;
}