题目就是 一个BFS+康拓展开 判重。
但是呢之前一直调不出来,便弃掉了。
今天早上拿出来再看一遍,发现自己的代码有两处错误,而且读错题目了。导致读入都错了。
放上自己又长又臭的代码 Orz
#include <cstdio> #include <algorithm> #include <cstring> #include <string> #include <iostream> #include <queue> using namespace std; struct moban{ string Read; int Hash,State[10]; }Aim,End,fuck; queue<moban>Q; int fac[]={1,1,2,6,24,120,720,5040}; bool vis[44444]; int GetHash(int now[]){ // for(int i=1;i<=8;i++) cout<<now[i]<<endl; int tot = 0; for(int i=1;i<=8;i++){ int ans=0; for(int j=i+1;j<=8;j++){ if(now[j] < now[i]) ans++; } tot+=ans*fac[8-i]; } return tot; } void Debug(string a){ for(int i=1;i<=a.length();i++){ cout<<a[i]<<" "<<endl; } cout<<endl; } void BFS(){ for(int i=1;i<=4;i++) fuck.State[i]=i; for(int i=8;i>=5;i--) fuck.State[i]=13-i; fuck.Hash=GetHash(fuck.State); if(fuck.Hash==Aim.Hash){ return; } Q.push(fuck); vis[fuck.Hash]=1; while( !Q.empty() ){ moban Start = Q.front(); Q.pop(); for(int i=1;i<=3;i++){ if(i==1){ moban Out; for(int i=1;i<=4;i++){ Out.State[i+4]=Start.State[i]; Out.State[i] = Start.State[i+4]; } Out.Hash=GetHash(Out.State); //cout<<Out.Hash<<endl; Out.Read = Start.Read + 'A'; if(!vis[Out.Hash]){ Q.push(Out); vis[Out.Hash]=1; } if(Out.Hash==Aim.Hash){ End = Out; return; } } if(i==2){ moban Out; Out.State[1]=Start.State[4]; Out.State[2]=Start.State[1]; Out.State[3]=Start.State[2]; Out.State[4]=Start.State[3]; Out.State[5]=Start.State[8]; Out.State[6]=Start.State[5]; Out.State[7]=Start.State[6]; Out.State[8]=Start.State[7]; //for(int i=1;i<=8;i++) cout<<Out.State[i]<<" "; Out.Hash=GetHash(Out.State); Out.Read = Start.Read + 'B'; if(!vis[Out.Hash]){ Q.push(Out); vis[Out.Hash]=1; } if(Out.Hash==Aim.Hash){ End = Out; return; } } if(i==3){ moban Out; Out.State[1] = Start.State[1]; Out.State[2] = Start.State[6]; Out.State[3] = Start.State[2]; Out.State[4] = Start.State[4]; Out.State[5] = Start.State[5]; Out.State[6] = Start.State[7]; Out.State[7] = Start.State[3]; Out.State[8] = Start.State[8]; Out.Hash=GetHash(Out.State); Out.Read = Start.Read + 'C'; if(!vis[Out.Hash]){ Q.push(Out); vis[Out.Hash]=1; } if(Out.Hash==Aim.Hash){ End = Out; return; } } } } } int main(){ int now[233]; for(int i=1;i<=4;i++){ cin>>Aim.State[i]; } for(int i=8;i>=5;i--){ cin>>Aim.State[i]; } Aim.Hash=GetHash(Aim.State); BFS(); cout<<End.Read.length()<<endl; for(int i=0;i<End.Read.length();i++){ cout<<End.Read[i]; } return 0; }