下棋方案数(填空) 二进制比dfs快多了
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
typedef long long LL;
typedef pair<int,int>PII;
int a[30],g[8][8];
LL ans;
void check()
{
int pos=0;
for(int i=1;i<=5;i++)
for(int j=1;j<=5;j++)
g[i][j]=a[++pos];
int s1=0,s2=0,s3=0,s4=0;
for(int i=1;i<=5;i++)
{
s1=0,s2=0;
for(int j=1;j<=5;j++)
{
s1+=g[i][j],s2+=g[j][i];
if(i==j) s3+=g[i][j];
if(i+j==6) s4+=g[i][j];
}
if(s1==0||s1==5||s2==0||s2==5) return;
}
if(s3==0||s3==5||s4==0||s4==5) return;
ans++;
}
int main()
{
for(int i=0;i<=(1<<25)-1;i++)
{
int s=0,pos=0;
for(int j=0;j<25;j++)
{
if(i>>j&1) s++,a[++pos]=1;
else a[++pos]=0;
}
if(s!=13) continue;
check();
}
cout<<ans;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int N=1010,M=N*N;
int g[10][10];
int ans=0;
void check()
{
int pos=0;
int s1=0,s2=0,s3=0,s4=0;
for(int i=1;i<=5;i++)
{
s1=0,s2=0;
for(int j=1;j<=5;j++)
{
s1+=g[i][j],s2+=g[j][i];
if(i==j) s3+=g[i][j];
if(i+j==6) s4+=g[i][j];
}
if(s1==0||s1==5||s2==0||s2==5) return;
}
if(s3==0||s3==5||s4==0||s4==5) return;
ans++;
}
void dfs(int x,int y,int k)
{
if(k==13)
{
check();
return;
}
if(x>=6||y>=6) return;
g[x][y]=1;
if(y+1==6)
dfs(x+1,1,k+1);
else dfs(x,y+1,k+1);
g[x][y]=0;
if(y+1==6)
dfs(x+1,1,k);
else dfs(x,y+1,k);
}
int main()
{
dfs(1,1,0);
cout<<ans;
return 0;
}