【18国庆训练赛1】2017-2018 ACM-ICPC, Asia Daejeon Regional Contest

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=
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值