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); }