代码:
就一个点要注意,判断和棋时的顺序问题,你可以先返回已经有赢家了,但返回可继续落子必须得在最后
#include <bits/stdc++.h>
using namespace std;
int g[6][6];
int res;
bool check(int x,int y,int color) //true表示下子后有赢家
{
if(x == 4 && y == 0)
{
bool flag = false; //flag为true表示没有和棋
for(int i = 0 ; i < 4 ; i ++)
{
if(g[i][x - i] != color) flag = true;
}
if(!flag) return false;
}
if(x == 4 && y == 4)
{
bool flag = false; //flag为true表示没有和棋
for(int i = 0 ; i < 5 ; i ++)
{
if(g[x][i] != color) flag = true;
}
if(!flag) return false;
flag = false;
for(int i = 0 ; i < 5 ; i ++)
{
if(g[i][y] != color) flag = true;
}
if(!flag) return false;
flag = false;
for(int i = 0 ; i < 5 ; i ++)
{
if(g[i][i] != color) flag = true;
}
if(!flag) return false;
}
if(x == 4 && y != 4 )
{
for(int i = 0 ; i < 5 ; i ++)
{
if(g[i][y] != color) return true;
}
return false;
}
if(x != 4 && y == 4)
{
for(int i = 0 ; i < 5 ; i ++)
{
if(g[x][i] != color) return true;
}
return false;
}
return true;
}
void dfs(int depth,int white,int black)
{
if(depth == 25)
{
res ++;
return;
}
int x = depth / 5; //0 - 4
int y = depth % 5;
if(white < 13)
{
g[x][y] = 1;
if(check(x,y,1))
{
dfs(depth + 1,white + 1,black);
}
g[x][y] = 0;
}
if(black < 12)
{
g[x][y] = 2;
if(check(x,y,2))
{
dfs(depth + 1,white,black + 1);
}
g[x][y] = 0;
}
return;
}
int main()
{
dfs(0,0,0);
cout << res << endl;
return 0;
}