【悬赏 5 RMB】双向广搜代码求条
查看原帖
【悬赏 5 RMB】双向广搜代码求条
1198296
封禁用户楼主2024/6/22 12:21

要求

  • 在我原有代码的基础上改,使用双向广搜

  • 告诉我错误点在哪里,以后怎么自己改出来

  • 改完以后第一时间@我大号,因为这个号一般不在线

#include<bits/stdc++.h>
using namespace std;
#define int long long
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
struct Chess{
	int x,y;
};
struct ChessBoard{
	Chess a[5];
}s,t;
const int N=9;
bool viss[N][N][N][N][N][N][N][N];
bool vist[N][N][N][N][N][N][N][N];
//是否可以跳子 
bool jump_over(ChessBoard x,int y,int z){//移动第y颗棋子,方向为z 
	int xx=x.a[y].x+dx[z];
	int yy=x.a[y].y+dy[z];
	for(int i=1;i<=4;++i){
		if(i==y){
			continue;
		}
		if(x.a[i].x==xx&&x.a[i].y==yy){
			return 1;
		}
	}
	return 0;
}
bool wrong(ChessBoard x,int y){//移动的第y颗棋子 
	int xx=x.a[y].x;
	int yy=x.a[y].y;
	for(int i=1;i<=4;++i){
		if(i==y){
			continue;
		}
		if(x.a[i].x==xx&&x.a[i].y==yy){
			return 1;//跳到另一个棋子上了 
		}
	}
	return 0;
}
void bfs(ChessBoard start,ChessBoard end){//双向广搜 
	int time=0;
	queue<ChessBoard> qs,qt;//起始\终止 
	viss[start.a[1].x][start.a[1].y][start.a[2].x][start.a[2].y]
		[start.a[3].x][start.a[3].y][start.a[4].x][start.a[4].y]=1;
	vist[end.a[1].x][end.a[1].y][end.a[2].x][end.a[2].y]
		[end.a[3].x][end.a[3].y][end.a[4].x][end.a[4].y]=1;
	qs.push(start);
	qt.push(end);
	while(!qs.empty()&&!qt.empty()){
		++time;
		if(time>8){
			cout<<"NO"<<endl;
			return ;
		}
		if(qs.size()>qt.size()){
			int w=qt.size();
			while(w--){
				ChessBoard tmp=qt.front();
				qt.pop();
				for(int i=1;i<=4;++i){//第i颗棋子 
					for(int j=0;j<4;++j){//j是方向 
						int xx=dx[j];
						int yy=dy[j];
						if(jump_over(tmp,i,j)){
							xx*=2,yy*=2;
						}
						ChessBoard to=tmp;
						to.a[i].x+=xx,to.a[i].y+=yy;
						if(vist[to.a[1].x][to.a[1].y][to.a[2].x][to.a[2].y]
						[to.a[3].x][to.a[3].y][to.a[4].x][to.a[4].y]) continue;
						if(to.a[i].x<1||to.a[i].x>8||to.a[i].y<1||to.a[i].y>8) continue;
						if(viss[to.a[1].x][to.a[1].y][to.a[2].x][to.a[2].y]
						[to.a[3].x][to.a[3].y][to.a[4].x][to.a[4].y]){
							cout<<"YES"<<endl;
							return ;
						}
						if(wrong(to,i)) continue;
						vist[to.a[1].x][to.a[1].y][to.a[2].x][to.a[2].y]
							[to.a[3].x][to.a[3].y][to.a[4].x][to.a[4].y]=1;
						qt.push(to);
					}
				}
			}
		}
		else{
			int w=qs.size();
			while(w--){
				ChessBoard tmp=qs.front();
				qs.pop();
				for(int i=1;i<=4;++i){//第i颗棋子 
					for(int j=0;j<4;++j){//j是方向 
					
						int xx=dx[j];
						int yy=dy[j];
						if(jump_over(tmp,i,j)){
							xx*=2,yy*=2;
						}
						ChessBoard to=tmp;
						to.a[i].x+=xx,to.a[i].y+=yy;
						if(to.a[i].x<1||to.a[i].x>8||to.a[i].y<1||to.a[i].y>8) continue;
						if(viss[to.a[1].x][to.a[1].y][to.a[2].x][to.a[2].y]
						[to.a[3].x][to.a[3].y][to.a[4].x][to.a[4].y]) continue;
						if(vist[to.a[1].x][to.a[1].y][to.a[2].x][to.a[2].y]
						[to.a[3].x][to.a[3].y][to.a[4].x][to.a[4].y]){
							cout<<"YES"<<endl;
							return ;
						}
						if(wrong(to,i)) continue;
						viss[to.a[1].x][to.a[1].y][to.a[2].x][to.a[2].y]
							[to.a[3].x][to.a[3].y][to.a[4].x][to.a[4].y]=1;
						qs.push(to);
					}
				}
			}
		}
	}
	cout<<"NO"<<endl;
	return ;
}
signed main(){
	while(cin>>s.a[1].x>>s.a[1].y){
		memset(viss,0,sizeof(viss));
		memset(vist,0,sizeof(vist));
		for(int i=2;i<=4;++i){
			cin>>s.a[i].x>>s.a[i].y;
		}
		for(int i=1;i<=4;++i){
			cin>>t.a[i].x>>t.a[i].y;
		}
		bfs(t,s);
	}
	return 0;
}
2024/6/22 12:21
加载中...