求助,顶给您点关注
  • 板块P2346 四子连棋
  • 楼主Addrian
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/10/27 21:09
  • 上次更新2023/10/27 22:45:40
查看原帖
求助,顶给您点关注
421128
Addrian楼主2023/10/27 21:09
就是一个很普通的迭代加深

不理解错哪,样例一直输出3

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
using namespace std;
string a1[9];
int a[9][9];
int tx1=0,ty1=0,tx2=0,ty2=0;
int dx[5]={1,0,-1,0};
int dy[5]={0,1,0,-1};
int xx,yy,xxx,yyy;
int sd; 
int cha(){
//	for(int i=1;i<=4;i++){
//		for(int j=1;j<=4;j++){
//			cout<<a[i][j]<<" ";
//		}
//		cout<<endl;
//	}
	for(int i=1;i<=4;i++){
		if((a[1][i]==a[2][i]&&a[2][i]==a[3][i]&&a[3][i]==a[4][i])||(a[i][1]==a[i][2]&&a[i][2]==a[i][3]&&a[i][3]==a[i][4])){
			//cout<<"giao1";
			return 1;
		}
	}
	if((a[1][1]==a[2][2]&&a[2][2]==a[3][3]&&a[3][3]==a[4][4])||(a[1][4]==a[2][3]&&a[2][3]==a[3][2]&&a[3][2]==a[4][1])){
		//cout<<"giao2";
		return 1;
	}
	return 0;
}
int dfs(int tx1,int ty1,int tx2,int ty2,int dep,int sq){//dep深度,sq上个啥棋
	//cout<<"giao";
	if(dep==sd){
		if(cha()==1){
			return 1;	
		}else{
			return 0;	
		} 	
	}
	for(int i=0;i<=3;i++){
		xx=tx1+dx[i];
		yy=ty1+dy[i];
		xxx=tx2+dx[i];
		yyy=ty2+dy[i];
		if(xx>0&&xx<=4&&yy>0&&yy<=4&&a[xx][yy]!=sq){
			swap(a[xx][yy],a[tx1][ty1]);
			if(dfs(xx,yy,tx2,ty2,dep+1,(sq==1?2:1))==1)return 1;
			swap(a[tx1][ty1],a[xx][yy]);//换回来不影响下边的 
		}
		if(xxx>0&&xxx<=4&&yyy>0&&yyy<=4&&a[xxx][yyy]!=sq){
			swap(a[xxx][yyy],a[tx2][ty2]);
			if(dfs(tx1,ty1,xxx,yyy,dep+1,(sq==1?2:1))==1)return 1;
			swap(a[tx2][ty2],a[xxx][yyy]);
		}
	}
	return 0;
}
int main(){
	for(int i=1;i<=4;i++){
		cin>>a1[i];
		for(int j=0;j<=3;j++){
			if(a1[i][j]=='B'){//黑 
				//cout<<"B";
				a[i][j+1]=2;
			}else if(a1[i][j]=='W'){
				//cout<<"W";
				a[i][j+1]=1;
			}else{
				a[i][j+1]=0;
				//cout<<"O";
				if(tx1==0){
					tx1=i;ty1=j+1;
				}else{
					tx2=i;ty2=j+1;
				}
			}
		}
		//cout<<endl;
	}
	for(int i=1;;i++){
		sd=i;
		if(dfs(tx1,ty1,tx2,ty2,0,1)==1)break;
		if(dfs(tx1,ty1,tx2,ty2,0,2)==1)break;
	}
	cout<<sd;
	return 0;
}
2023/10/27 21:09
加载中...