本题考查的是字符串。本题需要广度优先搜索。
字串变换:
#include <iostream>
#include <vector>
#include <queue>
#include <map>
using namespace std;
// 判断两个字符串是否可以通过变换得到
bool canTransform(string s1, string s2) {
int cnt = 0;
for(int i = 0; i < s1.length(); i++) {
if(s1[i] != s2[i]) {
cnt++;
}
}
return cnt == 1; // 如果只有一个字符不同,则可以通过变换得到
}
// 利用广度优先搜索找到从开始字符串到目标字符串的最短变换路径
int bfs(string start, string target, vector<string>& words) {
queue<string> q;
map<string, int> dist; // 记录每个字符串对应的变换步数
q.push(start);
dist[start] = 0;
while(!q.empty()) {
string cur = q.front();
q.pop();
if(cur == target) {
return dist[cur]; // 找到目标字符串,返回变换步数
}
for(int i = 0; i < words.size(); i++) {
if(canTransform(cur, words[i]) && !dist.count(words[i])) {
// 如果当前字符串可以通过变换得到 words[i],且该字符串还未被访问过
q.push(words[i]);
dist[words[i]] = dist[cur] + 1; // 更新变换步数
}
}
}
return -1; // 无法完成变换
}
int main() {
string start, target;
cin >> start >> target;
int n;
cin >> n;
vector<string> words(n);
for(int i = 0; i < n; i++) {
cin >> words[i];
}
int result = bfs(start, target, words);
cout << result << endl;
return 0;
}
在主函数中,我们首先读取输入的开始字符串 start
和目标字符串 target
,然后读取输入的字串变换规则的数量 n
。接下来,我们使用一个循环读取 n
个字串变换规则,并将它们存储在一个vector中。
最后,我们调用 bfs
函数进行广度优先搜索,找到从开始字符串到目标字符串的最短变换路径。如果找到了路径,则输出变换步数;否则,输出 -1 表示无法完成变换。