头像

欢迎来到我的博客

分享题解与总结

黑白棋

黑白棋

屏幕截图 2026-03-26 092627

屏幕截图 2026-03-26 092708

屏幕截图 2026-03-26 092817

思路:

  1. 注意:题目说了“部分格子”已填充

  2. 按从左到右,从上到下的顺序放,下标\(0->n*n-1\)

  3. 将下标映射成\((x,y)\)

  4. 放完下标为\(idx\)的棋子之后,先check,再继续搜索

  5. check:

    刚放的棋子\((x,y)\),是不是和\((x-2,y)\)\((x-1,y)\)三个同色

    如果已经有3行(及以上)的棋子,立即检查当前\((x,y)\)是不是与\((x,y-2)\)\((x,y-1)\)三个同色

    刚放的棋子\((x,y)\),有没有使得当前行(列)的白(黑)棋超过3个

    刚放的棋子\((x,y)\),有没有使得当前行(列)的白(黑)棋数目即使➕️剩余列(行)数,也无法达到3个

    如果已经放满一行,需要检查这一行的排列是否唯一

代码:

#include<bits/stdc++.h>
#define N 10
using namespace std;
int cntx[N][2],cnty[N][2],n,hlf=3;
int e[N][N]; 
string srow[N],scol[N];

//符合要求返回true
//否则返回false 

bool checkx3(int index)
{
	int cnt=0;
	int x=(index)/n,y=(index)%n;
	for(int i=0;i<3;++i){
		if(y-i>=0&&srow[x][y-i]==srow[x][y]){
			cnt++;
		}
	}
	if(cnt==3) return false;
	else return true;
}

bool checky3(int index)
{
	int cnt=0;
	int x=(index)/n,y=(index)%n;
	for(int i=0;i<3;++i){
		if(x-i>=0&&scol[y][x-i]==scol[y][x]){
			cnt++;
		}
	}
	if(cnt==3) return false;
	return true;
}

bool uniqRow(int index)
{
	for(int i=0;i<index;++i){
		if(srow[i]==srow[index]){
			return false;
		}
	}
	return true;
}

bool uniqCol()
{
	for(int i=0;i<n;++i){
		for(int j=i+1;j<n;++j){
			if(scol[i]==scol[j]){
				return false;
			}
		}
	}
	return true;
}

bool check(int index)
{
	bool flag=true;
	int x=(index)/n,y=(index)%n;
	
	flag=checkx3(index);
	if(!flag) return false;
	
	if(x>=2){
		flag=checky3(index);
		if(!flag) return false;
	}
	
	if(cntx[x][0]>3||cntx[x][1]>3||cnty[y][0]>3||cnty[y][1]>3) return false;
	if(cntx[x][0]+n-1-y<3||cntx[x][1]+n-1-y<3||cnty[y][0]+n-1-x<3||cnty[y][1]+n-1-x<3) return false;
	
	if(index%n==n-1) {
		flag=uniqRow(x);
		if(!flag) return false;
	}
	return true;
}

void dfs(int idx)
{
	int x,y;
	char ch;
	string s1,s2;
	if(idx==n*n){
		if(!uniqCol()) return ;
		for(int i=0;i<n;++i){
			for(int j=0;j<n;++j){
				printf("%d",e[i][j]);
			}
		}
		exit(0);
	}
	
	x=idx/n,y=idx%n;
	if(e[x][y]==-1){
		for(int i=0;i<2;++i){
			ch=i+'0';
			s1=srow[x],s2=scol[y];
			srow[x]+=ch;scol[y]+=ch;
			cntx[x][i]++,cnty[y][i]++;
			e[x][y]=i;
			if(check(idx)) 	dfs(idx+1);
			srow[x]=s1;scol[y]=s2;
			cntx[x][i]--,cnty[y][i]--;
			e[x][y]=-1;
		}
	}
	else{
		ch=e[x][y]+'0';
		s1=srow[x],s2=scol[y];
		srow[x]+=ch,scol[y]+=ch;
		cntx[x][e[x][y]]++,cnty[y][e[x][y]]++;
		if(check(idx)) dfs(idx+1);
		srow[x]=s1,scol[y]=s2;
		cntx[x][e[x][y]]--,cnty[y][e[x][y]]--;
	} 
}

int main()
{
	n=6;
	for(int i=0;i<n;++i){
		for(int j=0;j<n;++j){
			e[i][j]=-1;
		}
	}
	e[0][0]=e[4][2]=e[4][5]=e[5][4]=1;
	e[0][1]=e[0][3]=e[1][3]=e[2][4]=e[2][5]=e[5][1]=0;
	dfs(0);
	return 0;
}
posted @ 2026-03-26 12:42  king_steph1209  阅读(21)  评论(0)    收藏  举报