山寨版的双向BFS。。。
正着搜的结果存下来,反着收的结果在正着搜的结果里找。。。
4 4 4 5 5 4 6 5 2 4 3 3 3 6 4 6
YES
#include <iostream> #include <cstdio> #include <cstring> #include <set> #include <queue> #include <algorithm> using namespace std; const int dir_x[4]={-1,1,0,0}; const int dir_y[4]={0,0,-1,1}; bool inside(int x,int y) { if((x>=1&&x<=8)&&(y>=1&&y<=8)) return true; return false; } struct POINT { int x,y; bool operator<(const POINT& res) const { if(x!=res.x) return x<res.x; return y<res.y; } }; POINT st[4],ed[4]; int hahashsh(POINT st[]) { int haha=0; for(int i=0;i<4;i++) { haha=haha*10+st[i].x; haha=haha*10+st[i].y; } return haha; } set<int> panchong; struct NODE { int id,ti; }; int doit(int xx,int yy,int hs) { POINT rk[4]; int u=hs; for(int i=3;i>=0;i--) { rk[i].y=u%10; u/=10; rk[i].x=u%10; u/=10; } int x=rk[xx].x,y=rk[xx].y; int X=x+dir_x[yy],Y=y+dir_y[yy]; if(inside(X,Y)==false) return -1; bool flag=false; for(int i=0;i<4;i++) if(rk[i].x==X&&rk[i].y==Y) { flag=true; break; } if(flag==true) { int X2=X+dir_x[yy],Y2=Y+dir_y[yy]; if(inside(X2,Y2)==false) return -1; bool flag2=false; for(int i=0;i<4;i++) if(rk[i].x==X2&&rk[i].y==Y2) { flag2=true; break; } if(flag2==true) return -1; rk[xx].x=X2;rk[xx].y=Y2; } else { rk[xx].x=X;rk[xx].y=Y; } sort(rk,rk+4); return hahashsh(rk); } void zBFS(int ss) { queue<NODE> q; q.push((NODE){ss,0}); while(!q.empty()) { NODE u,v; u=q.front();q.pop(); if(u.ti+1>4) continue; for(int i=0;i<4;i++) { for(int j=0;j<4;j++) { ///4个棋子4个方向 int temp=doit(i,j,u.id); if(temp==-1) continue; if(panchong.count(temp)==0) { panchong.insert(temp); q.push((NODE){temp,u.ti+1}); } } } } } int fBFS(int es) { queue<NODE> q; set<int> fafa; fafa.clear(); fafa.insert(es); q.push((NODE){es,0}); while(!q.empty()) { NODE u,v; u=q.front(); q.pop(); if(u.ti+1>4) continue; for(int i=0;i<4;i++) { for(int j=0;j<4;j++) { ///4个棋子4个方向 int temp=doit(i,j,u.id); if(temp==-1) continue; if(panchong.count(temp)) return 1; if(fafa.count(temp)==0) { fafa.insert(temp); q.push((NODE){temp,u.ti+1}); } } } } return 0; } int solve(int ss,int es) { zBFS(ss); return fBFS(es); } int main() { while(scanf("%d%d",&st[0].x,&st[0].y)!=EOF) { for(int i=1;i<4;i++) scanf("%d%d",&st[i].x,&st[i].y); for(int i=0;i<4;i++) scanf("%d%d",&ed[i].x,&ed[i].y); sort(st,st+4);sort(ed,ed+4); panchong.clear(); panchong.insert(hahashsh(st)); if(solve(hahashsh(st),hahashsh(ed))) puts("YES"); else puts("NO"); } return 0; }