在我原有代码的基础上改,使用双向广搜
告诉我错误点在哪里,以后怎么自己改出来
改完以后第一时间@我大号,因为这个号一般不在线
#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;
}