/*很顯然的BFS,沒有懸念,只是實現起來有點麻煩寫完才發現,本題中,起點和終點都很明確,可以用雙搜不過我的單搜也沒有逾時*/#include <iostream>#include <algorithm>#include <map>#include <queue>using namespace std;//狀態struct node{char ch[4];//用char類型是為了省空間int ceil;};//判斷兩個狀態是否為同一狀態int equal(const node& a,const node& b){int i = 0, j = 0, ans = 0;while(i < 4&&j<4){if(a.ch[i] == b.ch[j]){ans++;i++;j++;}else if(a.ch[i] < b.ch[j])i++;else if(a.ch[i] > b.ch[j])j++;}return ans; }queue<node> Q;map<int, int> M;//避免狀態重複bool m[9][9];int main(){int a1[8], a2[8], i, j, id;node start, end, p, q;bool flag;while(cin>>a1[0]){flag = 0;id = 0;//輸入目標狀態for(i = 1; i < 8; i++)cin>>a1[i];//輸入初始狀態for(i = 0; i < 8; i++)cin>>a2[i];//記錄初始狀態,每個char儲存兩位元,分別是橫座標與縱座標for(i = 0; i < 4; i++){start.ch[i] = (a2[2*i])*10+a2[2*i+1];id = id * 100 + start.ch[i];}//將四個點按順序儲存,有利於後續操作sort(start.ch, start.ch+4);start.ceil = 0;//同樣方法處理目標狀態for(i = 0; i < 4; i++)end.ch[i] = (a1[2*i])*10+a1[2*i+1];sort(end.ch, end.ch+4);//典型的BFSwhile(!Q.empty())Q.pop();M.clear();M[id] = 1;Q.push(start);while(!Q.empty()){p = Q.front();Q.pop();if(p.ceil > 8)break;int ans = equal(p, end);if(ans == 4){flag = 1;break;}//最佳化:如果還能走2步,卻有3個棋子沒有在目標位置上,肯定不能成功if(ans < p.ceil - 4)continue;memset(m, 0, sizeof(m));//析出狀態對應的座標for(i = 0; i < 4; i++){int temp = (int)p.ch[i];m[temp/10][temp%10] = 1;}//下一步for(i = 0; i < 4; i++){int temp = (int)p.ch[i];int x = temp/10, y = temp%10;//上q = p;q.ceil++;if(x > 1){//下一步是空的,就走下一步if(m[x-1][y] == 0){q.ch[i] = (x-1)*10+y;sort(q.ch, q.ch+4);id = 0;for(j = 0; j < 4; j++)id = id * 100 + q.ch[j];if(M[id] == 0){Q.push(q);M[id] = 1;}}//下一步是棋子,下下步是空的,就跳一步else{if(x > 2 && m[x-2][y] == 0){q.ch[i] = (x-2)*10+y;sort(q.ch, q.ch+4);id = 0;for(j = 0; j < 4; j++)id = id * 100 + q.ch[j];if(M[id] == 0){Q.push(q);M[id] = 1;}}}}//下q = p;q.ceil++;if(x < 8){if(m[x+1][y] == 0){q.ch[i] = (x+1)*10+y;sort(q.ch, q.ch+4);id = 0;for(j = 0; j < 4; j++)id = id * 100 + q.ch[j];if(M[id] == 0){Q.push(q);M[id] = 1;}}else{if(x < 7 && m[x+2][y] == 0){q.ch[i] = (x+2)*10+y;sort(q.ch, q.ch+4);id = 0;for(j = 0; j < 4; j++)id = id * 100 + q.ch[j];if(M[id] == 0){Q.push(q);M[id] = 1;}}}}//左q = p;q.ceil++;if(y > 1){if(m[x][y-1] == 0){q.ch[i] = x*10+y-1;sort(q.ch, q.ch+4);id = 0;for(j = 0; j < 4; j++)id = id * 100 + q.ch[j];if(M[id] == 0){Q.push(q);M[id] = 1;}}else{if(y > 2 && m[x][y-2] == 0){q.ch[i] = x*10+y-2;sort(q.ch, q.ch+4);id = 0;for(j = 0; j < 4; j++)id = id * 100 + q.ch[j];if(M[id] == 0){Q.push(q);M[id] = 1;}}}}//右q = p;q.ceil++;if(y < 8){if(m[x][y+1] == 0){q.ch[i] = x*10+y+1;sort(q.ch, q.ch+4);id = 0;for(j = 0; j < 4; j++)id = id * 100 + q.ch[j];if(M[id] == 0){Q.push(q);M[id] = 1;}}else{if(y < 7 && m[x][y+2] == 0){q.ch[i] = x*10+y+2;sort(q.ch, q.ch+4);id = 0;for(j = 0; j < 4; j++)id = id * 100 + q.ch[j];if(M[id] == 0){Q.push(q);M[id] = 1;}}}}}}if(flag)cout<<"YES"<<endl;else cout<<"NO"<<endl;}return 0;}