msquare 有點超時

#include<iostream>
#include<fstream>
#include<string>
using namespace std;
#define null  NULL;
typedef struct node
{
	struct node * parent;//保存父節點
	string content;//保存本節點的操作序列
	int c[10];//保存本節點的狀態
}node;
typedef struct sequence
{
	node a[9000];
	int top;
}sequence;
void init(sequence * s)
{
	s->top=0;
}
void insert(sequence *s,node n)
{
	for(int i=s->top;i>=1;i--)
	{
		s->a[i]=s->a[i-1];
	}
	s->top++;
	s->a[0]=n;
}
node pop(sequence *s)
{
	s->top--;
	node n=s->a[s->top];
	return n;
}
int main()
{
	ifstream fin ("msquare.in");
	ofstream fout ("msquare.out");
	int i;
	int target[10];
	for(i=1;i<=8;i++)
	{
		fin>>target[i];
	}
	for(i=1;i<=8;i++)
	{
		if(target[i]!=i)
			break;
	}
	if(i>8)
	{
		fout<<0<<endl;
		fout<<endl;
		return 0;
	}
	sequence s;
	init(&s);
	node a,b,c;
	for(i=1;i<=8;i++)
	{
		a.c[i]=i;
		b.c[i]=i;
		c.c[i]=i;
	}
	a.parent=null;
	a.content="A";
	for(i=1;i<=4;i++)
	{
		int temp=a.c[i];
		a.c[i]=a.c[9-i];
		a.c[9-i]=temp;
	}
	b.parent=null;
	b.content="B";
	int temp[10];
	for(i=1;i<=8;i++)
	{
		temp[i]=b.c[i];
	}
	b.c[1]=temp[4];
	b.c[2]=temp[1];
	b.c[3]=temp[2];
	b.c[4]=temp[3];
	b.c[5]=temp[6];
	b.c[6]=temp[7];
	b.c[7]=temp[8];
	b.c[8]=temp[5];
	c.parent=null;
	c.content="C";
	int temp2=c.c[2];
	int temp3=c.c[3];
	int temp6=c.c[6];
	int temp7=c.c[7];
	c.c[2]=temp7;
	c.c[3]=temp2;
	c.c[6]=temp3;
	c.c[7]=temp6;
	insert(&s,a);
	insert(&s,b);
	insert(&s,c);
	bool t=true;
	while(t)
	{	
		node n=pop(&s);
		/*fout<<n.content<<endl;
		for(i=1;i<=8;i++)
		{
			fout<<n.c[i]<<' ';
		}
		fout<<endl;*/
		for(i=1;i<=8;i++)
		{
			if(n.c[i]!=target[i])
			{
				break;
			}
		}
		if(i>8)
		{
			fout<<n.content.length()<<endl;
			fout<<n.content<<endl;
			return 0;
		}
		node a,b,c;
		a.parent=&n;
		a.content=a.parent->content+"A";
		for(i=1;i<=8;i++)
		{
			a.c[i]=a.parent->c[i];
		}
		for(i=1;i<=4;i++)
		{
			int temp=a.c[i];
			a.c[i]=a.c[9-i];
			a.c[9-i]=temp;
		}
		b.parent=&n;
		b.content=b.parent->content+"B";
		for(i=1;i<=8;i++)
		{
			b.c[i]=b.parent->c[i];
		}
		int temp[10];
		for(i=1;i<=8;i++)
		{
			temp[i]=b.c[i];
		}
		b.c[1]=temp[4];
		b.c[2]=temp[1];
		b.c[3]=temp[2];
		b.c[4]=temp[3];
		b.c[5]=temp[6];
		b.c[6]=temp[7];
		b.c[7]=temp[8];
		b.c[8]=temp[5];
		c.parent=&n;
		c.content=c.parent->content+"C";
		for(i=1;i<=8;i++)
		{
			c.c[i]=c.parent->c[i];
		}
		int temp2=c.c[2];
		int temp3=c.c[3];
		int temp6=c.c[6];
		int temp7=c.c[7];
		c.c[2]=temp7;
		c.c[3]=temp2;
		c.c[6]=temp3;
		c.c[7]=temp6;
		insert(&s,a);
		insert(&s,b);
		insert(&s,c);
	}
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章