洛谷

https://www.luogu.org/problemnew/show/P1219

一开始朴素检查对角线就TLE了,给对角线编码之后压缩了13倍时间?

找了很久的bug居然是&&写成了&&&,我喷了。

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

bool cused[14];
bool zxused[30];
bool yxused[30];

//bool g[14][14];

int ans[30];
int atop=0;

int n;
int cnt=0;

inline int get_zx_id(int r,int c){
    //int ans=r-c+n;
    //printf("r=%d c=%d zid=%d
",r,c,ans);
    return r-c+n;
}

inline int get_yx_id(int r,int c){
    int rc=n+1-c;
    //int ans=r-rc+n;
    //printf("r=%d c=%d yid=%d
",r,c,ans);
    return r-rc+n;
}

void dfs(int r){
    if(r>n){
        cnt++;
        if(cnt<=3){
            for(int i=0;i<atop;i++){
                printf("%d%c",ans[i]," 
"[i==atop-1]);
            }
        }
    }

    for(int j=1;j<=n;j++){
        if(cused[j]==0&&zxused[get_zx_id(r,j)]==0&&yxused[get_yx_id(r,j)]==0){
            cused[j]=1;
            zxused[get_zx_id(r,j)]=1;
            yxused[get_yx_id(r,j)]=1;
            //g[r][j]=1;
            //ans[atop++]=r;
            ans[atop++]=j;
            dfs(r+1);
            atop-=1;
            //g[r][j]=0;
            zxused[get_zx_id(r,j)]=0;
            yxused[get_yx_id(r,j)]=0;
            cused[j]=0;
        }
    }
}

int main(){
    scanf("%d",&n);

    /*for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            printf("%2d ",get_zx_id(i,j));
        }
        printf("
");
    }

    printf("
");

    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            printf("%2d ",get_yx_id(i,j));
        }
        printf("
");
    }

    printf("
");*/

    int r=1;
    for(int j=1;j<=n;j++){
        cused[j]=1;
        zxused[get_zx_id(r,j)]=1;
        yxused[get_yx_id(r,j)]=1;
        ans[atop++]=j;
        dfs(r+1);
        atop-=1;
        yxused[get_yx_id(r,j)]=0;
        zxused[get_zx_id(r,j)]=0;
        cused[j]=0;
    }
    printf("%d
",cnt);
}
原文地址:https://www.cnblogs.com/Yinku/p/10658556.html