1 条题解
-
0
#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
- 上传者