状压
#include <iostream>
using namespace std;
//一维,二维存棋子的情况,1为白,0为黑
int a[30],b[10][10];
bool check()
{
//将一维数据存入二维
int t=0;
for(int i=1;i<=5;i++){
for(int j=1;j<=5;j++){
b[i][j]=a[++t];
}
}
//正对角线 反对角线
int s3=0,s4=0;
for(int i=1;i<=5;i++){
int s1=0,s2=0; //行 列
for(int j=1;j<=5;j++){
s1+=b[i][j];
s2+=b[j][i];
if(i==j) s3+=b[i][j];
if(i+j==6) s4+=b[i][j];
}
if(s1==5||s2==5||s1==0||s2==0) return 0;
}
if(s3==5||s4==5||s3==0||s4==0) return 0;
return 1;
}
int main()
{
int ans=0;
//状压枚举白棋在25个格子中分布情况
for(int i=1;i<1<<25;i++)
{
//位运算算出白棋的个数并将白棋的分布存入一维数组
int s=0;
for(int j=0;j<25;j++){
if(i>>j&1) s++;
a[j+1]=i>>j&1;
}
//只考虑白棋下13个情况
if(s!=13) continue;
if(check()) ans++;
}
cout<<ans;
return 0;
}
dfs
#include <iostream>
using namespace std;
int a[8][8];
int ans;
int check()
{
int cnt=0;
int s3=0,s4=0;
for(int i=1;i<=5;i++){
int s1=0,s2=0;
for(int j=1;j<=5;j++){
cnt+=a[i][j];
s1+=a[i][j]; //检查行
s2+=a[j][i]; //检查列
if(i==j) s3+=a[i][j]; //检查正对角线
if(i+j==6) s4+=a[i][j]; //检查反对角线
}
if(s1==5||s1==0||s2==5||s2==0) return 0;
}
if(s3==0||s3==5||s4==0||s4==5) return 0;
if(cnt!=13) return 0;
return 1;
}
//要对a[x][y]放棋
void dfs(int x,int y)
{
if(y==6) x++,y=1; //当一行放满
if(x==6&&y==1)
{
ans+=check();
return;
}
//下黑棋
a[x][y]=0;
dfs(x,y+1);
//下白棋
a[x][y]=1;
dfs(x,y+1);
}
int main()
{
dfs(1,1);
cout<<ans;
return 0;
}