題意:有9只盤子,排成1個圓圈。 其中8只盤子內裝着8只蚱蜢,有一個是空盤。 我們把這些蚱蜢順時針編號為 1~8 每只蚱蜢都可以跳到相鄰的空盤中,也可以再用點力,越過一個相鄰的蚱蜢跳到空盤中。 請你計算一下,如果要使得蚱蜢們的隊形改為按照逆時針排列, 並且保持空盤的位置不變(也就是1-8換位,2-7換位,...),至少要經過多少次跳躍? 注意:要求提交的是一個整數,請不要填寫任何多余內容或說明文字。
分析:結果是20。
#include<bits/stdc++.h> using namespace std; set<string> st; int deal(string s){ int len = s.size(); for(int i = 0; i < len; ++i){ if(s[i] == '0') return i; } } int bfs(){ queue<string> q; queue<int> step; q.push("012345678"); step.push(0); while(!q.empty()){ string s = q.front(); q.pop(); int tmpstep = step.front(); step.pop(); int id = deal(s); string tmps = s; int tmpid = (id + 1) % 9; tmps[id] = s[tmpid]; tmps[tmpid] = s[id]; if(!st.count(tmps)){ if(tmps == "087654321") return tmpstep + 1; st.insert(tmps); q.push(tmps); step.push(tmpstep + 1); } tmpid = (id + 2) % 9; tmps = s; tmps[id] = s[tmpid]; tmps[tmpid] = s[id]; if(!st.count(tmps)){ if(tmps == "087654321") return tmpstep + 1; st.insert(tmps); q.push(tmps); step.push(tmpstep + 1); } tmpid = (id + 8) % 9; tmps = s; tmps[id] = s[tmpid]; tmps[tmpid] = s[id]; if(!st.count(tmps)){ if(tmps == "087654321") return tmpstep + 1; st.insert(tmps); q.push(tmps); step.push(tmpstep + 1); } tmpid = (id + 7) % 9; tmps = s; tmps[id] = s[tmpid]; tmps[tmpid] = s[id]; if(!st.count(tmps)){ if(tmps == "087654321") return tmpstep + 1; st.insert(tmps); q.push(tmps); step.push(tmpstep + 1); } } return -1; } int main(){ printf("%d\n", bfs()); return 0; }