rendered paste body#include <iostream>#include <list>#include <vector>#include <cmath>using namespace std;const long int SZ = 876543210, Final = 123456780;list<long int> Q,Steps;vector<bool> Visited(876543210, false);inline int getDigit(long int num, int pos){ long int tmp = num/(long int)pow10(pos-1); return tmp%10;}void enQChildren (long int state, long int depth){ int pos, digit; long int tmp, child; for (pos=1, tmp=state; tmp%10!=0; pos++, tmp/=10) {} if(pos>3) { digit = getDigit(state, pos-3); child = state + digit*((long int)pow10(pos-1)) - digit*((long int)pow10(pos-4)); Q.push_back(child); Steps.push_back(depth+1); } if(pos<7) { digit = getDigit(state, pos+3); child = state + digit*((long int)pow10(pos-1)) - digit*((long int)pow10(pos+2)); Q.push_back(child); Steps.push_back(depth+1); } if(pos%3!=0) { digit = getDigit(state, pos+1); child = state + digit*((long int)pow10(pos-1)) - digit*((long int)pow10(pos)); Q.push_back(child); Steps.push_back(depth+1); } if(pos%3!=1) { digit = getDigit(state, pos-1); child = state + digit*((long int)pow10(pos-1)) - digit*((long int)pow10(pos-2)); Q.push_back(child); Steps.push_back(depth+1); } }void printQ(){ list<long int>::iterator iter; for (iter = Q.begin(); iter != Q.end(); iter++) cout<<*iter<<" "; cout<<endl;}long int BFS(long int start){ long int state, steps; Q.push_back(start); Steps.push_back(0); while(!Q.empty()) { char ch; state = Q.front(); steps = Steps.front(); // printQ(); // cin>>ch; if(state == Final) return steps; else if(!Visited[state]) { enQChildren(state, steps); Visited[state] = true; } Q.pop_front(); Steps.pop_front(); } return -1;}int main(){ long int start=0, ans; int tmp; for (int i=0; i<9; i++) { cin>>tmp; start = start*10+tmp; } ans = BFS(start); if(ans == -1) cout<<"No"<<endl; else cout<<"Yes"<<endl; cout<<ans<<endl; return 0;}