#include #include #include #include #include using namespace std; class State{ public : int buf[20]; int size; bool operator==(const State &t) const; bool operator<(const State &t) const; void Load(); int Solve(); void Print(); }; bool State::operator==(const State &t) const{ if(size!=t.size){ assert(!"err");//return false; } for(int i=0;i> buf[i]; } size = 20; } int State::Solve(){ int score = size; State st; set s,next_s; set::iterator p; int j; int trg[4]; s.insert(*this); while(!s.empty()){ for(p = s.begin();p!=s.end();p++){ for(int i=0;isize;i++){ trg[0] = ((i&3)!=3 ? i+1 : -1); trg[1] = ((i&3)!=3 ? i+5 : -1); trg[2] = ((i&3)!=0 ? i+3 : -1); trg[3] = i+4; for(j=0;j<4;j++){ if(trg[j]==-1 || trg[j] >= p->size) continue; if(p->buf[i] != p->buf[trg[j]]) continue; st = *p; memmove(st.buf+trg[j],st.buf+trg[j]+1,sizeof(int)*(st.size-trg[j]-1)); memmove(st.buf+i,st.buf+i+1,sizeof(int)*(st.size-i-2)); st.size-=2; next_s.insert(st); } } } s.clear(); s.swap(next_s); if(!s.empty()) score-=2; } return score; } void State::Print(){ for(int i=0;i> n; for(int i=0;i