锰锌钢靴OI霸王猴球条

P1219 [USACO1.5] 八皇后 Checker Challenge

IaLWH @ 2024-08-09 11:06:06

rt,目前只打算输出解的总数

#include<cstdio>
#define xrr x+j*dx[i]
#define yrr y+j*dy[i]
int n;
const int dx[8]={0,1,1,1,0,-1,-1,-1},dy[8]={1,1,0,-1,-1,-1,0,1};
bool v[20][20];

int dfs(int x,int y){
    int ans=0;
    v[x][y]=1;
    for(int i=0;i<8;i++)
        for(int j=1;xrr>=0&&xrr<n&&yrr>=0&&yrr<n;j++)
            v[xrr][yrr]=1;

    for(int i=0;i<n;i++){
        if(x+2>n)return 1;
        if(v[x+1][i])continue;
        ans+=dfs(x+1,i);
    }
    v[x][y]=0;
    for(int i=0;i<8;i++)
        for(int j=1;xrr>=0&&xrr<n&&yrr>=0&&yrr<n;j++)
            v[xrr][yrr]=0;
    return ans;
}
int main(){
    int n,ans=0;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
        ans+=dfs(0,i);
    printf("%d",ans);
    return 0;
}

by IaLWH @ 2024-08-09 11:16:37

稍微改了一下,还是样例WA

#include<cstdio>
#define xrr x+j*dx[i]
#define yrr y+j*dy[i]
int n;
const int dx[8]={0,1,1,1,0,-1,-1,-1},dy[8]={1,1,0,-1,-1,-1,0,1};
int v[20][20];

int dfs(int x,int y){
    int ans=0;
    v[x][y]++;
    for(int i=0;i<8;i++)
        for(int j=1;xrr>=0&&xrr<n&&yrr>=0&&yrr<n;j++)
            v[xrr][yrr]++;

    for(int i=0;i<n;i++){
        if(x+1>=n)return 1;
        if(v[x+1][i])continue;
        ans+=dfs(x+1,i);
    }
    v[x][y]--;
    for(int i=0;i<8;i++)
        for(int j=1;xrr>=0&&xrr<n&&yrr>=0&&yrr<n;j++)
            v[xrr][yrr]--;
    return ans;
}
int main(){
    int n,ans=0;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
        ans+=dfs(0,i);
    printf("%d",ans);
    return 0;
}

|