最初的实现代码,但提交不成功,经过认真思考,我目前想到的问题即是:本实现方法使用了深度优先算法,如果步长允许的话,会循环一圈,如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; }