P1032 字串变换

最近在练习bfs,看到了02年提高组的这个题,顿时来了兴致,联想到前一阵子的八数码问题,具体就是使用一个字符串来存储状态,把他存储到一个图中,然后开始bfs,如果10步之内无法完成就剪枝,同时使用哈希来优化判重。下面贴上代码。

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1000;
string A, B, from[maxn], to[maxn];
string state[maxn];
int dist[maxn];
int n = 3;
set<int> vis;
void init_lookup_table() {
	vis.clear();
}
int try_to_insert(string s) {
	int v = 0;
	for(int i = 0; i < s.length(); i++) v += s[i] - 65;
	if(vis.count(v)) return 0;
	vis.insert(v);
	return 1;
}
int bfs() {
	init_lookup_table();
	int front = 1, rear = 2;
	while(front < rear) {
		string& s = state[front];
		if(s == B) return front;
		for(int i = 0; i < n; i++) {
			int pos = 0;
			while(p = s.find(from[i], pos)) {
				string w;
				w = s.substr(0, p) + to[i] + s.substr(p+to[i].length(), s.length());
				dist[rear] = dist[front] + 1;
				if(try_to_insert(w)) rear++;
				pos = p;
			}
		}
		front++;
	}
}
int main() {
	cin >> A >> B;
	for(int i = 0; i < n; i++) {
		cin >> from[i] >> to[i];
	}
	int ans = bfs();
	cout << dist[ans];
}

posted on 2016-10-29 08:54  蒟蒻konjac  阅读(225)  评论(0编辑  收藏  举报