4 4 4 5 5 4 6 5 2 4 3 3 3 6 4 6
YES
#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; /* 尽管网上都是双广的解法,俺还是执着愚钝的单广...不小心还MLE了一次,于是vis改成了bool,且为88888888 */ struct node { int x[4],y[4],step; }p; int move[][2]={0,1,1,0,0,-1,-1,0}; bool vis[8][8][8][8][8][8][8][8]; bool mat[9][9]; void set(node s) { vis[s.x[0]][s.y[0]][s.x[1]][s.y[1]][s.x[2]][s.y[2]][s.x[3]][s.y[3]]=1; } bool test(node s) { return vis[s.x[0]][s.y[0]][s.x[1]][s.y[1]][s.x[2]][s.y[2]][s.x[3]][s.y[3]]; } bool okend(node s) { int i; for(i=0;mat[s.x[i]][s.y[i]]&&i<4;++i); return (i==4); } bool inboard(int x,int y) { if(x>=8||x<0||y>=8||y<0) return 0; return 1; } bool isempty(node s,int k) { for(int i=0;i<4;++i) if(i!=k&&s.x[i]==s.x[k]&&s.y[i]==s.y[k]) return 0; return 1; } bool bfs() { p.step=0; if(okend(p)) return 1; memset(vis,0,sizeof(vis)); queue<node> que; que.push(p); int i,j,k; node t; while(!que.empty()) { p=que.front(); /*好久以前一直没A的题,因为一些事就放下了. 之所以执着的些单广是因为结果是WA而不是TLE,终于找到原因 ,这里之前竟然是>8,不淡定啊,然后就AC了。 */ if(p.step>=8) return 0; que.pop(); for(k=0;k<4;++k) for(i=0;i<4;++i) { t=p; t.step++; t.x[k]+=move[i][0]; t.y[k]+=move[i][1]; if(inboard(t.x[k],t.y[k])) { if(!test(t)) { if(isempty(t,k)) { if(okend(t)) return 1; set(t); que.push(t); } else { t.x[k]+=move[i][0]; t.y[k]+=move[i][1]; if(inboard(t.x[k],t.y[k])&&isempty(t,k)&&!test(t)) { if(okend(t)) return 1; set(t); que.push(t); } } } } } } return 0; } int main() { int i,x,y; while(scanf("%d%d",&x,&y)==2) { --x; --y; p.x[0]=x; p.y[0]=y; for(i=1;i<4;++i) { scanf("%d%d",&x,&y); --x; --y; p.x[i]=x; p.y[i]=y; } memset(mat,0,sizeof(mat)); for(i=0;i<4;++i) { scanf("%d%d",&x,&y); --x; --y; mat[x][y]=1; } printf(bfs()?"YES\n":"NO\n"); } return 0; }