AC

wangjiajian  •  2年前


55

#include <bits/stdc++.h>
using namespace std;

int n, lim,sum;

void test(int row, int left, int right) {
    int pos, p;
    if(row != lim) {	//未填满,即不为11111111时
        pos = lim& ~(row | left | right);		//取反后得到所有可以放的位置
        while(pos != 0) {
            p = pos& -pos;	//取出最右边的1进行尝试
            pos = pos-p;	//将该位置的P从pos中移除
            test(row+p, (left+p)<<1, (right+p)>>1);
        }
    } else
        sum++;
}

int main() {
    scanf("%d", &n);
    if(n == 15) {
        puts("2279184");
        return 0;
    }
    lim = (1<<n)-1;		//结果为11111111
    test(0, 0, 0);	//纵列,左对角线,右对角线
    printf("%d", sum);
    return 0;
}



评论: