四子连棋

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
#define inf 1000000000
char a[5][5];
int ans,Ox1,Ox2,Oy1,Oy2,move[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
bool check()
{
	for(int i=1;i<=4;i++)
	 {
	 	if(a[i][1]==a[i][2]&&a[i][1]==a[i][3]&&a[i][1]==a[i][4]) return 1;
	 	if(a[1][i]==a[2][i]&&a[1][i]==a[3][i]&&a[1][i]==a[4][i]) return 1;
	 }
	 if(a[1][1]==a[2][2]&&a[1][1]==a[3][3]&&a[1][1]==a[4][4]) return 1;
	 if(a[1][4]==a[2][3]&&a[1][4]==a[3][2]&&a[1][4]==a[4][1]) return 1;
	return 0; 
}
bool can(int x,int y,char p)
{
	return x>=1&&x<=4&&y>=1&&y<=4&&a[x][y]!=p;
}
bool dfs(int x1,int y1,int x2,int y2,char pre,int step)
{
	if(step==ans)
	{
		if(check()) return 1;
		else return 0;
	}
	for(int i=0;i<4;i++)
	{
		int nx1,ny1,nx2,ny2;
		nx1=x1+move[i][0];
		ny1=y1+move[i][1];
		nx2=x2+move[i][0];
		ny2=y2+move[i][1];
		if(can(nx1,ny1,pre))
		{
			swap(a[x1][y1],a[nx1][ny1]);
			if(dfs(nx1,ny1,x2,y2,(pre=='B'?'W':'B'),step+1)) return 1;
			swap(a[nx1][ny1],a[x1][y1]);
		}
		if(can(nx2,ny2,pre))
		{
			swap(a[x2][y2],a[nx2][ny2]);
			if(dfs(x1,y1,nx2,ny2,(pre=='B'?'W':'B'),step+1)) return 1;
			swap(a[nx2][ny2],a[x2][y2]);
		}
	}
	return 0;
}
int main()
{
	for(int i=1;i<=4;i++)
	{
		char s[5];
		scanf("%s",s);
		for(int j=1;j<=4;j++)
		{
			a[i][j]=s[j-1];
			if(a[i][j]=='O')
			{
				if(Ox1==0)
				  Ox1=i,Oy1=j;
				else
				 Ox2=i,Oy2=j;
			}
			
		}
	}
	for(ans=1;ans<=inf;ans++)//枚举上界
	{
		if(dfs(Ox1,Oy1,Ox2,Oy2,'W',0)) break;//黑先 
		if(dfs(Ox1,Oy1,Ox2,Oy2,'B',0)) break;//白先 
	 } 
	 printf("%d\n",ans);
	 return 0;
 } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值