10085

#include <iostream>
#include <string.h>
#include <string>
#include <vector>

#define MX 1000003

using namespace std;

int kase = 1;
int in[9];
int visit[MX];
int next[MX];
int par[MX];
char val[MX];
int num[MX][9];
int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
vector<int> vb[MX];
string s;

int GetHash(int *arr)
{
	int h=0;
	for(int i=0;i<9;i++)
	{
		h=h*10+arr[i];
	}

	h=h%MX;
	return h;
}


bool isNew(int *arr,int pos)
{
	int h=GetHash(arr);

	for(int i=0;i<vb[h].size();i++)
	{
		if(memcmp(arr,num[i]],sizeof(arr))==0)
		return false;
	}

	vb[h].push_back(pos);

	return true;
}

//isNew() in a different way but same algo
/*
bool isNew(int *arr,int pos)
{
	int h=GetHash(arr);
	int u = visit[h];

	while(u)
	{
		if(memcmp(num[u],arr,sizeof(num[u]))==0)
		return false;
		u = next[u];
	}

	next[pos] = visit[h];
	visit[h] = pos;

	return true;
}
*/
int path(int n)
{
	if(par[n]!=-1)
	{
		s.append(1u,val[n]);
		path(par[n]);
	}
	else
	return 0;
}

void bfs()
{
	int front =1,rear=0;
	memcpy(num[0],in,sizeof(in));
	int b[9];
	par[0]=-1;
	while(front>rear)
	{
		int a[9];
		int zero;
		memcpy(a,num[rear],sizeof(a));
		for(int i=0;i<9;i++)
		{
			if(a[i]==0)
			{
				zero=i;
				break;
			}
		}

		int dx =zero/3;
		int dy =zero%3;

		for(int i=0;i<4;i++)
		{
			int x = dir[i][0]+dx;
			int y = dir[i][1]+dy;
			if(x>=0&&x<3&&y>=0&&y<3)
			{
				int m = 3*x+y;
				memcpy(b,a,sizeof(a));
				b[zero] = a[m];
				b[m] = a[zero];
				memcpy(num[front],b,sizeof(b));
				if(isNew(b,front))
				{
					par[front]=rear;
					if(i==0)
						val[front]='D';
					else if(i==1)
						val[front]='R';
					else if(i==2)
						val[front]='U';
					else if(i==3)
						val[front]='L';

					front++;
				}
			}
		}
		rear++;
	}
	front--;
	cout<<"Puzzle #"<<kase++<<"\n";
	for(int i=0;i<9;i++)
	{
		cout<<num[front][i]<<((i%3==2)?"\n":" ");
	}
	s="";
	path(front);

	for(int i=s.size()-1;i>=0;i--)
		cout<<s[i];
	cout<<"\n\n";
}



int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		for(int i=0;i<9;i++)
		{
			cin>>in[i];
		}
		//memset(visit,0,sizeof(visit));
		//memset(next,0,sizeof(next));
		for(int i=0;i<MX;i++)
		{
			vb[i].clear();
			visit[i]=0;
			par[i]=0;
		}
		bfs();
	}
	return 0;
}

 

Leave a Reply

Your email address will not be published. Required fields are marked *