P1219 [USACO1.5]八皇后 Checker Challenge

经典八皇后,需要用一些标记数组优化对角线、横线

P1219 [USACO1.5]八皇后 Checker Challenge

以n=6为例,主对角线(黑)和副对角线(红)各有11(2n-1)条,需要判断一个点\((x,y)\)所在的对角线

公式:\(idx_{red} = y + x - 1, idx_{black}= y-x+n\)

#include<iostream>
using namespace std;

const int N = 20;

int pos[N];
int cnt;
int dg1[2 * N - 1];
int dg2[2 * N - 1];
int l[N];

int n;

int check(int x, int y){
    if(l[x]) return 0;
    if(dg1[y - x + n] || dg2[y + x - 1]) return 0;
    return 1;
}

void dfs(int u){
    if(u == n + 1){
        if(cnt ++ < 3){
            for(int i = 1; i <= n; i ++) cout << pos[i] << ' ';
            cout << endl;
        }
        return;
    }
    
    for(int i = 1; i <= n; i ++){
        if(check(i, u)){
            dg1[u - i + n] ++;
            dg2[u + i - 1] ++;
            pos[u] = i;
            l[i] ++;
            dfs(u + 1);
            dg1[u - i + n] --;
            dg2[u + i - 1] --;
            pos[u] = 0;
            l[i] --;
        }
    }
}

int main(){
    cin >> n;
    
    dfs(1);
    cout << cnt << endl;
    
    return 0;
}
上一篇:X-AA-Challenge X-AA-Challenge-ID X-AA-Challenge-Result


下一篇:BZOJ2287: 【POJ Challenge】消失之物(背包dp)