康拓展开的经典题目! n! - 0 = (n - 1)*(n - 1)! + (n - 2)*(n - 2)! + …… + 2*2! + 1*1! 判重去吧!不解释! 【magic sqaure】 /* ID: wangqia6 TASK: msquare LANG: C++ */ #include <fstream> #include <cstring> #include <string> using namespace std; const long FACT[8] = {1,1,2,6,24,120,720,5040}; const long FIR = 40319; const long LEN = 50000; struct rec { long num,step; string path; } queue[LEN]; ifstream fin ("msquare.in"); ofstream fout ("msquare.out"); long data[8],tmp[8],i,head = 0,tail = 0,key,aim; bool vis[LEN],use[9]; long change_to_num(const long data[]) { long i,j,key = 0,sum; for (i = 0; i < 8; i++) { sum = 0; for (j = 0; j < i; j++) if (data[j] < data[i]) sum++; key += FACT[i] * sum; } return key; } void change_to_data(long key) { long sum,i,j; memset(use,0,sizeof(use)); for (i = 7; i >=0; i--) { sum = key / FACT[i]; key %= FACT[i]; for(j = 1; j <= 8; j++) if (! use[j]) { sum--; if (sum < 0) { data[i] = j; use[j] = true; break; } } } return; } void solve_prob(long t) { switch (t) { case 1: tmp[0] = data[7]; tmp[1] = data[6]; tmp[2] = data[5]; tmp[3] = data[4]; tmp[4] = data[3]; tmp[5] = data[2]; tmp[6] = data[1]; tmp[7] = data[0]; break; case 2: tmp[1] = data[0]; tmp[2] = data[1]; tmp[3] = data[2]; tmp[0] = data[3]; tmp[6] = data[7]; tmp[5] = data[6]; tmp[4] = data[5]; tmp[7] = data[4]; break; case 3: tmp[0] = data[0]; tmp[7] = data[7]; tmp[3] = data[3]; tmp[4] = data[4]; tmp[1] = data[6]; tmp[2] = data[1]; tmp[5] = data[2]; tmp[6] = data[5]; break; } return; } void push_it(long key, char ch) { if (! vis[key]) { tail++; queue[tail].num = key; queue[tail].step = queue[head].step + 1; queue[tail].path = queue[head].path + ch; vis[key] = true; } return; } void writeit(string st) { for (long i = 0; i < st.size(); i++) { fout << st[i]; if (i % 60 == 59) fout << endl; } if (st.size() % 60 != 59) fout << endl; return; } int main() { memset(vis,0,sizeof(vis)); for (i = 0; i < 8; i++) fin >> data[i]; aim = change_to_num(data); queue[head].num = FIR; if (queue[head].num == aim) { fout << 0 << endl; fout << endl; fin.close(); fout.close(); return 0; } queue[head].step = 0; queue[head].path = ""; vis[queue[head].num] = true; while (head <= tail) { change_to_data(queue[head].num); solve_prob(1); key = change_to_num(tmp); push_it(key,'A'); if (key == aim) { fout << queue[tail].step << endl; writeit(queue[tail].path); break; } solve_prob(2); key = change_to_num(tmp); push_it(key,'B'); if (key == aim) { fout << queue[tail].step << endl; writeit(queue[tail].path); break; } solve_prob(3); key = change_to_num(tmp); push_it(key,'C'); if (key == aim) { fout << queue[tail].step << endl; writeit(queue[tail].path); break; } head++; } fin.close(); fout.close(); return 0; }