警钟无效,20pts求调
查看原帖
警钟无效,20pts求调
890346
Autumn_0930楼主2024/4/14 16:43

DFS迭代加深 思路与第一篇题解类似(代码也很像)

但是WA on #1 #2 #4 TLE on #5

看了讨论区的警钟好像都没说到我的问题上,dalao提供的几个好人数据也过了,不知道问题出在哪里

#include<bits/stdc++.h>
using namespace std;
int mp[5][5],ans=0;
int dx[5]={-1,0,0,1},dy[5]={0,-1,1,0};
bool check(){
	for(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 1;
		if(mp[1][i]==mp[2][i]&&mp[2][i]==mp[3][i]&&mp[3][i]==mp[4][i]) return 1;
	}
	if(mp[1][1]==mp[2][2]&&mp[2][2]==mp[3][3]&&mp[3][3]==mp[4][4]) return 1;
	if(mp[1][4]==mp[2][3]&&mp[2][3]==mp[3][2]&&mp[3][2]==mp[4][1]) return 1;
	return 0;
}
bool dfs(int op,int col,int x1,int y1,int x2,int y2){ // op即当前操作轮数 
	if(op>ans){ 
		if(check()) return 1;
		return 0;
	}
	// 搜索第一个空 
	for(int i=0;i<4;i++){
		int xx=x1+dx[i],yy=y1+dy[i];
		if(xx>=1&&xx<=4&&yy>=1&&yy<=4&&mp[xx][yy]==col){
			swap(mp[x1][y1],mp[xx][yy]);
			if(dfs(op+1,3-col,xx,yy,x2,y2)) return 1;
			swap(mp[x1][y1],mp[xx][yy]);
		}
	}
	// 搜索第二个空 
	for(int i=0;i<4;i++){
		int xx=x2+dx[i],yy=y2+dy[i];
		if(xx>=1&&xx<=4&&yy>=1&&yy<=4&&mp[xx][yy]==col){
			swap(mp[x2][y2],mp[xx][yy]);
			if(dfs(op+1,3-col,x1,y1,xx,yy)) return 1;
			swap(mp[x2][y2],mp[xx][yy]);
		}
	}
	return 0;
} 
int main(){
	// 读入地图 
	int sx1,sy1,sx2,sy2;
	for(int i=1;i<=4;i++){
		for(int j=1;j<=4;j++){
			char c;
			cin>>c;
			if(c=='B') mp[i][j]=1;       // 1为黑 
			else if(c=='W') mp[i][j]=2;  // 2为白 
			else mp[i][j]=0;             // 0为空 
			if(mp[i][j]==0&&sx1==0) sx1=i,sy1=j;
			else if(mp[i][j]==0) sx2=i,sy2=j;
		}
	}	
	// 逐步增大搜索深度ans 
	while(++ans){
		if(dfs(1,1,sx1,sy1,sx2,sy2)) break; // 黑方先走
		if(dfs(1,2,sx1,sy1,sx2,sy2)) break; // 白方先走
	}
	cout<<ans;
	return 0;
}
2024/4/14 16:43
加载中...