蓝桥杯_翻转_C++
题目描述:


题解:
解题思路:
思路:
1、S 和 T 都是由 多个0或1组合而成
① 数据输入:
第一行输入一个整数 D ,代表有 D 组 S和T 的组合
接下来 2D 行 依此代表T1,S1,T2,S2,...,TD,SD
② 数据处理 :010 -> 000, 101->111,可转换。判断 S 是否可以转换为 T,若可转换,需进行几次 01 变换
可通过 S 和 T 的挨个比较来进行判断::
- 若 Si==Ti 则继续进行判断。
- 若 Si!=Ti 则看Si 是否满足转换条件 (Si!=Si-1,Si!=Si+1) ,满足则转换Si,最后看S是否与T相等来判断是否可以转换。
代码实现
cpp
#include <iostream> // 引入输入输出库
#include <string> // 引入字符串库
using namespace std; // 使用标准命名空间
int main(int argc, char const *argv[])
{
int D; // 用于存储测试用例的数量
cin >> D; // 从标准输入读取测试用例数量
int flag = 0; // 初始化一个标识变量,这里并未使用
// 循环处理每一个测试用例
for (int i = 0; i < D; i++){
string S, T; // 声明两个字符串 S 和 T
cin >> T >> S; // 从输入读取两个字符串 T 和 S
int len = S.size(); // 获取字符串 S 的长度
// 如果两个字符串相同,输出 0,表示不需要任何变换
if (S == T){
cout << 0 << endl; // 输出 0
continue; // 跳过后续代码,进入下一次循环
}
// 如果 S 和 T 的首尾字符不同,输出 -1,表示无法通过变换匹配
if (S[0] != T[0] || S[len - 1] != T[len - 1]){
cout << -1 << endl; // 输出 -1
continue; // 跳过后续代码,进入下一次循环
}
int count = 0; // 计数器,用于记录所需变换的次数
// 遍历字符串 S 的中间字符(不包括首尾)
for (int i = 1; i < len - 1; i++){
// 如果当前字符 S[i] 不等于 T[i]
if (S[i] != T[i]){
// 检查当前字符 S[i] 的两侧字符是否与其不同
if (S[i - 1] != S[i] && S[i + 1] != S[i]){
// 如果是,则将 S[i] 更改为 S[i-1]
S[i] = S[i - 1];
count++; // 记录变换次数
} else {
break; // 如果不满足,停止变换
}
}
}
// 检查经过变换后 S 是否与 T 相等
if (S == T){
cout << count << endl; // 输出变换次数
} else {
cout << -1 << endl; // 输出 -1,表示无法匹配
}
}
return 0; // 主函数返回 0,表示程序正常结束
}
欢迎大家和我沟通交流(✿◠‿◠)