四子连棋

迭代加深搜索模板。

题目传送门 P2346 四子连棋

首先每次钦定一个 \(ans\) ,然后用 \(dfs\) 尝试这个 \(ans\) 是否可行,如果可行就直接输出,如果不可行就钦定 \(ans++\) .

\(dfs\) 当中传递 \(6\) 个参数 \(x,y,X,Y,dep,prev\) 分别表示第一个空点坐标、第二个空点坐标,目前遍历到的深度(已经操作后的数量)、黑棋走/白棋走。

然后对这个 \(dfs\) 函数进行转移,最终求得这种方案是否可行,基本上没有任何剪枝。

然后这个玩意就只剩这些了。

#include <bits/stdc++.h>
#define ll long long
#define put {std::cout<<ans<<std::endl;std::exit(0);}
#define Register register
#define mp m
int c[11][5]={{0,0,0,0,0},
{0,1,2,3,4},{0,5,6,7,8},{0,9,10,11,12},{0,13,14,15,16},
{0,1,5,9,13},{0,2,6,10,14},{0,3,7,11,15},{0,4,8,12,16},
{0,1,6,11,16},{0,4,7,10,13}
};

int dirx[]{0,0,1,0,-1};
int diry[]{0,1,0,-1,0};

char m[5][5];

bool check(){
	for(register int i=1;i<=4;++i){
		if(mp[i][1]==mp[i][2] && mp[i][2]==mp[i][3] && mp[i][3]==mp[i][4]) return true;
		if(mp[1][i]==mp[2][i] && mp[2][i]==mp[3][i] && mp[3][i]==mp[4][i]) return true;
	}
	if(mp[1][1]==mp[2][2] && mp[2][2]==mp[3][3] && mp[3][3]==mp[4][4]) return true;
	if(mp[4][1]==mp[3][2] && mp[3][2]==mp[2][3] && mp[1][4]==mp[2][3]) return true;
	return false;
}

bool judge(int x1,int x2,char ch){
	if(x1<1 || x1>4 || x2<1 || x2>4 || ch==mp[x1][x2]) return false;
	return true;
} 
int ans=0;
void output(void){
	for(register int i=1;i<=4;++i){
		for(register int j=1;j<=4;++j)
			std::cout<<mp[i][j]<<' ';
			std::cout<<std::endl;
	}
}
bool dfs(int dep,int x,int y,int X,int Y,char prev){
	if(dep==ans)return check();
	for(register int i=1;i<=4;++i){
		int nx,ny,nX,nY;
		nx=x+dirx[i],ny=y+diry[i],
		nX=X+dirx[i],nY=Y+diry[i];
		if(judge(nx,ny,prev)){
			std::swap(mp[x][y],mp[nx][ny]);
			if(dfs(dep+1,nx,ny,X,Y,prev=='W'?'B':'W'))put
			std::swap(mp[x][y],mp[nx][ny]);
		}if(judge(nX,nY,prev)){
			std::swap(mp[X][Y],mp[nX][nY]);
			if(dfs(dep+1,x,y,nX,nY,prev=='W'?'B':'W'))put
			std::swap(mp[X][Y],mp[nX][nY]);
		}
	}
	return false;
}
char nc;int stx,sty,stX,stY;

int main(){
	for(register int i=1;i<=4;++i)
	for(Register int j=1;j<=4;++j){std::
		cin>>nc,m[i][j]=nc;
		if(mp[i][j]=='O'){
			if(!stx && !sty) stx=i,sty=j;
			else stX=i,stY=j;
		}
	}
	if(check()){
		std::cout<<0<<std::endl;
		return 0;
	}
	while(++ans){
		if(dfs(0,stx,sty,stX,stY,'W')) put
		if(dfs(0,stx,sty,stX,stY,'B')) put
	}
	return 11037;
}
posted @ 2023-10-01 13:47  q(x)  阅读(54)  评论(0)    收藏  举报