Sicily 1150 简单魔方

由于用深度优先搜索算法不能提交,故采用广度搜索优先算法。这里的广度优先算法比较特殊一点,就是我采用了类似加法器的进位机制来实现。(make by liurunjia 转载请注明出处,thx)

#include <stdlib.h>

#include <iostream>

using namespace std;

#define N 10

//定义数据结构

typedef struct node{

	int a1;

	int a2;

	int a3;

	int a4;

	int a5;

	int a6;

	int a7;

	int a8;

}Node; 

//操作数组 

char optArray[N]; 

Node StateNode;//表示当前状态 

Node Target;//表示目标状态 

int STEP;



//声明比较函数

bool isEqual(Node a,Node b);

//声明操作函数(操作符)

void operatorFunction(char opt); 

//模仿加法进位,返回值表示是否已经达到最大值,即不能再进位了 

bool IncreaseByStep()

{

	bool flag=true;

	for(int i=0;i<STEP&&flag;i++)

	{

		if(optArray[i]=='O')

		{

			optArray[i]='A';

			flag=false;

			continue;

		}

		else if(optArray[i]=='A')

		{

			optArray[i]='B';

			flag=false;

			continue;

		}

		else if(optArray[i]=='B')

		{

			optArray[i]='C';

			flag=false;

			continue;

		}

		else

		{

			if(i==STEP-1)

			{

				return false;

			}

			optArray[i]='A';

			continue;

		}

	}

	//	 for(int i=0;i<N;i++)

	//	 {

	//	  		 cout<<optArray[i];

	//	 }

	//	 cout<<endl;



	return true;

}

//

void init()

{

	for(int i=0;i<N;i++)

	{

		optArray[i]='O';

	}

} 

void initState()

{

	StateNode.a1=1;

	StateNode.a2=2;

	StateNode.a3=3;

	StateNode.a4=4;

	StateNode.a5=8;

	StateNode.a6=7;

	StateNode.a7=6;

	StateNode.a8=5;

}





int main()

{





	while(cin>>STEP&&STEP!=-1)

	{

		cin>>Target.a1>>Target.a2>>Target.a3>>Target.a4>>Target.a5>>Target.a6>>Target.a7>>Target.a8;

		bool myFlag=true;

		init();

		initState();



		while(myFlag)

		{

			if(IncreaseByStep())

			{

				initState();

				bool stepFlag=true;

				int stepInfact;

				for(int j=N-1;j>=0;j--)

				{

					if(optArray[j]!='O')

					{

						if(stepFlag)

						{

							stepInfact=j+1;

							stepFlag=false;		

						}

						operatorFunction(optArray[j]);	

					}

				}

				if(isEqual(StateNode,Target))

				{

					cout<<stepInfact<<" ";

					for(int j=stepInfact-1;j>=0;j--)

					{

						cout<<optArray[j];

					}

					cout<<endl;

					myFlag=false;

				}



			}

			else

			{

				myFlag=false;

			}



		}

		if(myFlag)

		{

			cout<<-1<<endl;

		}

	}

}

//定义比较函数

bool isEqual(Node a,Node b)

{

	return a.a1==b.a1&&a.a2==b.a2&&a.a3==b.a3&&a.a4==b.a4&&a.a5==b.a5&&a.a6==b.a6&&a.a7==b.a7&&a.a8==b.a8;

}



//定义操作函数(操作符)

void operatorFunction(char opt)

{

	if(opt=='A')

	{

		int temp=StateNode.a1;

		StateNode.a1=StateNode.a5;

		StateNode.a5=temp;



		temp=StateNode.a2;	 

		StateNode.a2=StateNode.a6;

		StateNode.a6=temp;	



		temp=StateNode.a3;	 

		StateNode.a3=StateNode.a7;

		StateNode.a7=temp;	



		temp=StateNode.a4;	 

		StateNode.a4=StateNode.a8;

		StateNode.a8=temp;	

	}

	else if(opt=='B')

	{



		int temp=StateNode.a4;

		StateNode.a4=StateNode.a3;

		StateNode.a3=StateNode.a2;

		StateNode.a2=StateNode.a1;

		StateNode.a1=temp;



		temp=StateNode.a8;

		StateNode.a8=StateNode.a7;

		StateNode.a7=StateNode.a6;

		StateNode.a6=StateNode.a5;

		StateNode.a5=temp;



	}

	else

	{

		int temp=StateNode.a2;

		StateNode.a2=StateNode.a6;

		StateNode.a6=StateNode.a7;

		StateNode.a7=StateNode.a3;

		StateNode.a3=temp;

	}

	//     cout<<opt<<endl;

	//     cout<<StateNode.a1<<" "<<StateNode.a2<<" "<<StateNode.a3<<" "<<StateNode.a4<<endl;

	//     cout<<StateNode.a5<<" "<<StateNode.a6<<" "<<StateNode.a7<<" "<<StateNode.a8<<endl;



}



 

你可能感兴趣的:(CI)