利用map来实现对以访问字符串的标记
#include<iostream>
#include<map>
#include<queue>
using namespace std;
struct miya {
string str;
int num;
};
void BFS(string str) {
map<string, bool> isvisited; //保存以及访问过的结点
queue<miya> myqueue;
miya prime;
prime.num = 0; prime.str = str;
myqueue.push(prime); //初始结点入栈
isvisited[prime.str] = true;
while (!myqueue.empty()) {
miya cur = myqueue.front();
myqueue.pop(); //弹出队首元素
if (cur.str.find("2012") != string::npos) {
cout << cur.num << endl;
return;
}
for (int i = 1; i < cur.str.size(); i++) {
char temp;
miya neighber = cur;
temp = neighber.str[i];
neighber.str[i] = neighber.str[i - 1];
neighber.str[i - 1] = temp; //完成字符位移
neighber.num++;
if (isvisited.find(neighber.str) == isvisited.end())
{
isvisited[neighber.str] = true;
myqueue.push(neighber); //将未访问结点入栈
}
else continue;
}
}
}
int main()
{
//使用广度优先搜索来实现
int n;
string str;
while (cin >> n) {
cin >> str;
BFS(str);
}
}