https://vjudge.net/contest/258556
B Connect3
题意:两人在4*4的棋盘里下棋,先手执黑第一步必下在(1,x),所有棋子只能下在第一行或者另一个棋子的上面。问:有多少种后手胜且最后一步下在(a,b)的方案。(不考虑下棋过程)
题解:因为条件严苛(轮流下,下棋位置少),所以合法情况不多,DFS和BFS都行,直接3进制判重即可。
#include<bits/stdc++.h>
using namespace std;
int Fr,EX,EY;
bool b[50000001];
int a[30][30];
int dl[11093001];
bool dll[11093001];
int Ans;
bool Win(int x,int y,int z)
{
a[x][y]=z;
for(int i=1;i<=4;i++)
{
if(a[i][1]==z&&a[i][2]==z&&a[i][3]==z) {a[x][y]=0;return true;}
if(a[i][4]==z&&a[i][2]==z&&a[i][3]==z) {a[x][y]=0;return true;}
if(a[1][i]==z&&a[2][i]==z&&a[3][i]==z) {a[x][y]=0;return true;}
if(a[4][i]==z&&a[2][i]==z&&a[3][i]==z) {a[x][y]=0;return true;}
}
for(int i=2;i<=3;i++)
for(int j=2;j<=3;j++)
{
if(a[i][j]==z&&a[i+1][j+1]==z&&a[i-1][j-1]==z) {a[x][y]=0;return true;}
if(a[i][j]==z&&a[i+1][j-1]==z&&a[i-1][j+1]==z) {a[x][y]=0;return true;}
}
a[x][y]=0;
return false;
}
int Rec()
{
int Sum=0;
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
Sum=Sum*3+a[i][j];
return Sum;
}
void Out(int x)
{
int X=x;
for(int i=4;i>=1;i--)
for(int j=4;j>=1;j--)
{
a[i][j]=X%3;
X/=3;
}
}
int main()
{
scanf("%d%d%d",&Fr,&EX,&EY);
a[1][Fr]=1;
int Now=