1 条题解

  • 0
    @ 2025-10-8 16:53:46
    #include<bits/stdc++.h>
    using namespace std;
    int n,a[10],b[10],ans;//a对应的是黑皇后,b对应的是白皇后,ans为可行方案数 
    bool v[10][10];//v[i][j]这个格子能不能放。1为能,0为不能 
    bool rowa[10],cola[10],lfta[20],rhta[20];//a数组所对应的 row/col/lft/rht 数组  
    bool rowb[10],colb[10],lftb[20],rhtb[20];//b数组所对应的 row/col/lft/rht 数组 
    void dfs(int x) 
    {
    	if(x==2*n+1)ans++;//做到了第2*n+1行?那说明前面的2*n行都是可行的,累计! 
        else if (x<=n)//对于放黑皇后的操作~
        {
            for(int y=1;y<=n;y++)
               if(rowa[x] && cola[y] && lfta[x-y+n] && rhta[x+y] && v[x][y])//当前[x][y]这个位置在行、列、斜、能否放 都可行吗? 
               {
                  a[x]=y;
                  rowa[x]=cola[y]=lfta[x-y+n]=rhta[x+y]=v[x][y]=0;//设为不可行 
                  dfs(x+1);//下一行 
                  a[x]=0;
                  rowa[x]=cola[y]=lfta[x-y+n]=rhta[x+y]=v[x][y]=1;//还原 
               }
        }
        else//对于放白皇后的操作~
        { 
            for(int y=1;y<=n;y++)
               if(rowb[x-n] && colb[y] && lftb[(x-n)-y+n] && rhtb[(x-n)+y] && v[x-n][y]) 
               {
                  b[x-n]=y;
                  rowb[x-n]=colb[y]=lftb[(x-n)-y+n]=rhtb[(x-n)+y]=v[x-n][y]=0;
                  dfs(x+1);
                  b[x-n]=0;
                  rowb[x-n]=colb[y]=lftb[(x-n)-y+n]=rhtb[(x-n)+y]=v[x-n][y]=1;
               }
            //有没有发现这里的k都减去了一个n?因为此时的x均是大于n的,而我们的棋盘仍是n*n,故x-n 
        }
    }
    int main()
    {
        scanf("%d",&n);
        memset(rowa,1,sizeof(rowa));
        memset(cola,1,sizeof(cola));
        memset(lfta,1,sizeof(lfta));
        memset(rhta,1,sizeof(rhta));
        memset(rowb,1,sizeof(rowb));
        memset(colb,1,sizeof(colb));
        memset(lftb,1,sizeof(lftb));
        memset(rhtb,1,sizeof(rhtb));
        //清空 
        for (int i=1;i<=n;i++)
            for (int j=1;j<=n;j++)
                scanf("%d",&v[i][j]);//读入是否可放皇后 
        ans=0;dfs(1);
        printf("%d\n",ans); 
        return 0;
    }
    
    • 1

    信息

    ID
    820
    时间
    1000ms
    内存
    128MiB
    难度
    7
    标签
    递交数
    320
    已通过
    72
    上传者