All pastes #97250 Raw Edit

Unnamed

public cpp v1 · immutable
#97250 ·published 2006-07-23 14:18 UTC
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;}