对角线验证出了个想不通的问题

P1219 [USACO1.5] 八皇后 Checker Challenge

GK_PRC @ 2023-03-05 09:46:55

//对角线上的x+y、x-y(最小是-12)是定值, //???x-y(最小是1-13=-12),为什么x-y+12只能过前四个点??? 比如n=10,正确答案724,加12就是720

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;

#define N 14

int a[N], ans, n;
int b1[N], b2[N], b3[N*N];//分别记录y,x+y,x-y+30是否被占用 
//对角线上的x+y、x-y(最小是-12)是定值,加30是为了避免数组下标为负数 
//???x-y(最小是1-13=-12),为什么x-y+12只能过前四个点??? 比如n=10,正确答案724,加12就是720

void dfs(int k){//第k行的皇后放哪个位置 
    if(k > n){//如果所有皇后已放完 
        ans++;
        if(ans<=3){
            for(int i=1;i<=n;i++)
                cout<<a[i]<<' ';
            cout<<endl; 
        }
        return;
    }
    //可以认为是将1~n填入n个空中,代表每行第几列有一个皇后 
    for(int i=1;i<=n;i++){//枚举第k行的皇后能放的位置(即第几列) 
        if(b1[i]==0 && b2[k+i]==0 && b3[k-i+30]==0){
            a[k]=i;//记录放置位置 
            b1[i]=1; b2[k+i]=1; b3[k-i+30]=1;//占位 
            dfs(k+1);//下一层递归 
            b1[i]=0; b2[k+i]=0; b3[k-i+30]=0;//取消占位 
        }
    }
}

int main(){
    cin>>n;
    dfs(1);
    cout<<ans; 
    return 0;
}

by keaier @ 2023-03-05 09:51:04

///


|