答案是3126376。
白棋先手,故白棋共13枚,黑棋共12枚。
问:棋盘上白棋13枚,黑棋12枚,且没有五种同色连成一条线的情况的种数有多少?
可以枚举所有黑白棋填满棋盘的情况,然后逐个判断每种情况是否满足没有五子连线。
白子赋1,黑子赋-1。
这里dfs时需按照一定顺序来填棋盘,否则可能陷入死循环。
#include<bits/stdc++.h>
using namespace std;
int q[8][8];
long long res;
bool check1(int x, int y) //检查点(x, y)的水平,竖直两个方向是否有连子,没五子则返回true
{
//竖直
bool flag1 = false; //若非五子,则赋值为true
for (int i = 1; i <= 5; i++)
if (q[x][i] != q[x][y])
flag1 = true;
//水平
bool flag2 = false; //若非五子,则赋值为true
for (int i = 1; i <= 5; i++)
if (q[i][y] != q[x][y])
flag2 = true;
if (flag1 && flag2)
return true;
else
return false;
}
bool check2() //检查两条对角线,若均无五子,返回true
{
bool flag1 = false; //若非五子,则赋值为true
for (int i = 1; i <= 5; i++)
if (q[i][i] != q[1][1])
flag1 = true;
bool flag2 = false;
for (int i = 1; i <= 5; i++)
if (q[i][6 - i] != q[1][5])
flag2 = true;
if (flag1 && flag2)
return true;
else
return false;
}
void dfs(int w, int b, int x, int y) //白子剩余数目w,黑子剩余数目b,当前判断位置(x, y)
{
if (w + b == 1) //只剩1枚棋子和1个位置,开始判断局面上是否存在五子连线
{
if (w == 1)
q[x][y] = 1;
else
q[x][y] = -1;
bool flag= false; //若存在1个五子就变成true
for (int i = 1; i <= 5; i++)
if (!check1(i, i))
flag = true;
if (!check2())
flag = true;
if (flag == false)
res++;
q[x][y] = 0;
return;
}
if (w >= 1) //当前位置落白子
{
q[x][y] = 1;
int xd, yd;
if (y < 5) //往右走
{
xd = x;
yd = y + 1;
}
if (y == 5) //下一行
{
xd = x + 1;
yd = 1;
}
if (xd >= 1 && xd <= 5 && yd >= 1 && yd <= 5) //在棋盘内
dfs(w - 1, b, xd, yd);
}
if (b >= 1) //当前位置落黑子
{
q[x][y] = -1;
int xd, yd;
if (y < 5) //往右走
{
xd = x;
yd = y + 1;
}
if (y == 5) //下一行
{
xd = x + 1;
yd = 1;
}
if (xd >= 1 && xd <= 5 && yd >= 1 && yd <= 5) //在棋盘内
dfs(w, b - 1, xd, yd);
}
}
int main()
{
dfs(13, 12, 1, 1);
cout << res;
}