1150 简单魔方

最初的实现代码,但提交不成功,经过认真思考,我目前想到的问题即是:本实现方法使用了深度优先算法,如果步长允许的话,会循环一圈,如AAAA后在做其他预算。

#include "stdlib.h"
#include "iostream"
#define N 10
using namespace std;
struct Node{
       int a1;
       int a2;
       int a3;
       int a4;
       int a5;
       int a6;
       int a7;
       int a8;       
};
struct Node myNode[N+1];
struct Node EndState;
char resultSteps[N];
int steps;//表示输入的总步数 
bool stopFlag;
bool isEqual(struct Node a,struct 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;
}
bool search(int flag,int stepInfo);
int main()
{

    myNode[0].a1=1;
    myNode[0].a2=2;
    myNode[0].a3=3;
    myNode[0].a4=4;
    myNode[0].a5=8;
    myNode[0].a6=7;
    myNode[0].a7=6;
    myNode[0].a8=5;
    //myNode
    while(cin>>steps&&steps!=-1)
    {
        cin>>EndState.a1>>EndState.a2>>EndState.a3>>EndState.a4>>EndState.a5>>EndState.a6>>EndState.a7>>EndState.a8;
		stopFlag=true;
        //先判断是否和最初步数一样
        if(isEqual(EndState,myNode[0]))
        {
              cout<<"0"<<endl;
              continue;
        } 
        bool result=false;
        resultSteps[0]='A';
        //cout<<"***"<<1<<"A"<<"***"<<endl;
        result=search(1,1);
        if(!result)
        {
             resultSteps[0]='B';
             //cout<<"***"<<1<<"B"<<"***"<<endl;
             result=search(2,1);
             
        }
        if(!result)
        {
             resultSteps[0]='C';
             //cout<<"***"<<1<<"C"<<"***"<<endl;
             result=search(3,1); 
        }
        if(!result)
        {
		 		   cout<<"-1"<<endl;
		}
    }
    //system("pause");
    return 0;
}
bool search(int flag,int stepInfo)
{
     if(!stopFlag)
     {
          return true;
     }
     if(stepInfo>=steps)
     {
		   return false;
	 }
     if(flag==1)
     {
          myNode[stepInfo].a1=myNode[stepInfo-1].a5;
          myNode[stepInfo].a2=myNode[stepInfo-1].a6;
          myNode[stepInfo].a3=myNode[stepInfo-1].a7;
          myNode[stepInfo].a4=myNode[stepInfo-1].a8;
          myNode[stepInfo].a5=myNode[stepInfo-1].a1;
          myNode[stepInfo].a6=myNode[stepInfo-1].a2;
          myNode[stepInfo].a7=myNode[stepInfo-1].a3;
          myNode[stepInfo].a8=myNode[stepInfo-1].a4;
          
          if(!isEqual(myNode[stepInfo],EndState))
          {
                bool result=false;
                resultSteps[stepInfo]='A';
                //cout<<"***"<<stepInfo+1<<"A"<<"***"<<"     ";
                result=search(1,stepInfo+1);
                if(!result)
                {
                     resultSteps[stepInfo]='B';
                     //cout<<"***"<<stepInfo+1<<"B"<<"***"<<"     ";
                     result=search(2,stepInfo+1);
                }
                if(!result)
                {
                     resultSteps[stepInfo]='C';
                     //cout<<"***"<<stepInfo+1<<"C"<<"***"<<"     ";
                     result=search(3,stepInfo+1); 
                     
                }
          }
          else
          {
              stopFlag=false;
              cout<<stepInfo<<" ";
              for(int i=0;i<stepInfo;i++)
              {
                      cout<<resultSteps[i];
              }
              cout<<endl;
              return true;
          }
     }
     if(flag==2)
     {
          myNode[stepInfo].a1=myNode[stepInfo-1].a4;
          myNode[stepInfo].a2=myNode[stepInfo-1].a1;
          myNode[stepInfo].a3=myNode[stepInfo-1].a2;
          myNode[stepInfo].a4=myNode[stepInfo-1].a3;
          myNode[stepInfo].a5=myNode[stepInfo-1].a8;
          myNode[stepInfo].a6=myNode[stepInfo-1].a5;
          myNode[stepInfo].a7=myNode[stepInfo-1].a6;
          myNode[stepInfo].a8=myNode[stepInfo-1].a7;
          if(!isEqual(myNode[stepInfo],EndState))
          {
                bool result=false;
                resultSteps[stepInfo]='A';
                //cout<<"***"<<stepInfo+1<<"A"<<"***"<<"     ";
                result=search(1,stepInfo+1);
                if(!result)
                {
                     resultSteps[stepInfo]='B';
                     //cout<<"***"<<stepInfo+1<<"B"<<"***"<<"     ";
                     result=search(2,stepInfo+1);

                }
                if(!result)
                {
                     resultSteps[stepInfo]='C';
                     //cout<<"***"<<stepInfo+1<<"C"<<"***"<<"     ";
                     result=search(3,stepInfo+1); 
                     
                }
          }
          else
          {
              stopFlag=false;
              cout<<stepInfo<<" ";
              for(int i=0;i<stepInfo;i++)
              {
                      cout<<resultSteps[i];
              }
              cout<<endl;
              return true;
          }
     }
     if(flag==3)
     {
          myNode[stepInfo].a1=myNode[stepInfo-1].a1;
          myNode[stepInfo].a2=myNode[stepInfo-1].a6;
          myNode[stepInfo].a3=myNode[stepInfo-1].a2;
          myNode[stepInfo].a4=myNode[stepInfo-1].a4;
          myNode[stepInfo].a5=myNode[stepInfo-1].a5;
          myNode[stepInfo].a6=myNode[stepInfo-1].a7;
          myNode[stepInfo].a7=myNode[stepInfo-1].a3;
          myNode[stepInfo].a8=myNode[stepInfo-1].a8;
          if(!isEqual(myNode[stepInfo],EndState))
          {
                bool result=false;
                resultSteps[stepInfo]='A';
                //cout<<"***"<<stepInfo+1<<"A"<<"***"<<"     ";
                result=search(1,stepInfo+1);
                if(!result)
                {
                     resultSteps[stepInfo]='B';
                     //cout<<"***"<<stepInfo+1<<"B"<<"***"<<"     ";
                     result=search(2,stepInfo+1);

                }
                if(!result)
                {
                     resultSteps[stepInfo]='C';
                     //cout<<"***"<<stepInfo+1<<"C"<<"***"<<"     ";
                     result=search(3,stepInfo+1); 
                     
                }
          }
          else
          {
              stopFlag=false;
              cout<<stepInfo<<" ";
              for(int i=0;i<stepInfo;i++)
              {
                      cout<<resultSteps[i];
              }
              cout<<endl;
              return true;
          }
     }
     return false;
}

  

转载于:https://www.cnblogs.com/growing/archive/2011/12/17/2290979.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值