黑白棋
黑白棋



思路:
-
注意:题目说了“部分格子”已填充
-
按从左到右,从上到下的顺序放,下标\(0->n*n-1\)
-
将下标映射成\((x,y)\)
-
放完下标为\(idx\)的棋子之后,先check,再继续搜索
-
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;
}

浙公网安备 33010602011771号