//采用广度优先遍历 #include "stdio.h" #include "string" #include "queue" #include "map" using namespace std; struct TreeNode{ string code; int sum; }; int BFS_CODE(string str){ queue<TreeNode> myQueue;//用于广度优先遍历 map<string,bool> myMap;//用于识别字符串相同的TreeNode TreeNode node; node.code = str; node.sum = 0; myQueue.push(node); myMap[str] = true; while (!myQueue.empty()){ TreeNode node2 = myQueue.front(); myQueue.pop(); string code = node2.code;int sum = node2.sum; int count = node2.code.find("2012"); if (count != string::npos) return node2.sum; for (int i = 0; i < node2.code.size()-1; ++i) { swap(node2.code[i],node2.code[i+1]); node2.sum++; map<string,bool> ::iterator it = myMap.find(node2.code); if (it != myMap.end()){//map中已有此字符串 swap(node2.code[i],node2.code[i+1]);//此处再交换是不让node2中的code改变 node2.sum--; continue; } else{ myQueue.push(node2); myMap[node2.code] = true; swap(node2.code[i],node2.code[i+1]);//与上面的再交换同理 node2.sum--; } } } return -1; } int main(){ int N;char buf[14]={}; while (scanf("%d",&N)!=EOF){ getchar(); for (int i = 0; i < N; ++i) { scanf("%c",buf+i); } string str = buf; printf("%d\n", BFS_CODE(str)); } }