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;

}

 

转载于:https://www.cnblogs.com/growing/archive/2011/12/18/2291870.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值