やっと解けたっていうか昔から一応正しい答え出すソースあったんだけど、ずっとTLEしてた。
原因は毎回手数を探索していたからで、最初に"01234567"から遷移できる全ての状態に対する手数をメモってから、それを出力するようにしたら高速化した。
#include <iostream> #include <map> #include <algorithm> #include <queue> using namespace std; int di[]={1,-1,4,-4}; bool check(int n){return n<8 && n>=0;} int main(){ string t; map<string,int> done; queue<string> Q; Q.push("01234567"); while(!Q.empty()){ string q = Q.front();Q.pop(); int x = q.find("0"); for(int i=0;i<4;i++){ if(x%4==0 && i==1)continue; if(x%4==3 && i==0)continue; if(!check(x+di[i]))continue; t = q , swap(t[x],t[x+di[i]]); if(done.find(t)!=done.end() )continue; Q.push(t); done[t] = done[q] + 1; } } while(getline(cin,t)){ t.erase(remove(t.begin(),t.end(),' '),t.end()); cout << done[t] << endl; } }