一只小蒟蒻备考蓝桥杯的日志
笔记
DFS的巨坑
void DFS(string now, int length) {
max_length = max(max_length, length);
for(int i = 0; i < N; i++) {
if(used_cnt[i] >= 2) {
continue;
}
int covered_length = covered(now, strings[i]);
if(covered_length == -2 || covered_length == -1) {
continue;
}
used_cnt[i]++;
string now_ = now + strings[i].substr(covered_length, strings[i].length());
int length_ = length + (strings[i].length() - covered_length);
DFS(now_, length_);
//千万千万不能
/*
now += strings[i].substr(covered_length, strings[i].length());
length += (strings[i].length() - covered_length);
DFS(now, length);
*/
used_cnt[i]--;
}
}
以及,之前DFS都有明确的退出条件,加在for循环前就可以及时退出了,这题没有,不影响,它正常退出就好
string 查找
参考 C++ string类的使用 (蓝桥杯比赛必备知识) 干货,太干了
str1.find(str2, pos)
从str1下标为pos的地方开始找str2,碰到的第一组的第一个字母下标返回
没找到返回 -1
没有pos,默认从头开始(index=0)
str1.rfind
从右往左找,我不确定它下标返回的是str2第一个还是最后一个下标
其余同find
str.substr(index1, index2)
返回 str [index1, index2) 的子串
勘误!!!第2个参数不是index下标,是length!!!
(2024年3月24日)
我保证之前肯定学过,就是忘记了…这次又学好久慢慢琢磨
这次的Demo
在两个单词相连时,其重合部分合为一部分
例如 beast 和 astonish,如果接成一条龙则变为 beastonish
另外相邻的两部分不能存在包含关系,例如 at 和 atide 间不能相连。
int covered(string str1, string str2) {
int re = -1;
int length1 = str1.length();
int length2 = str2.length();
for(int i = min(length1, length2); i >= 1; i--){
int begin_index = str1.find(str2.substr(0, i), length1 - i);
// cout << length1 - i << " " << begin_index << endl;
if(begin_index != -1) {
if(i == length2) { //完全重叠
re = -2;
} else {
re = i; //重叠长度
}
break;
}
}
// substr(x1, x2) -> [x1, x2) index下标
// find -> return 下标
return re;
}
刷题
心得
- …这道题把我折磨得心力交瘁,最终没有ac,过了一半,太累了放一放
DFS,我发现了一个从来没有犯过的错,记录如下
DFS里有for循环,把所有数据过一边,挑其中可行的进下一轮DFS循环,以之前做的,都是mov型的,就是在xy坐标的基础上加个mov实现移动
Attention!!!!
是不是每次都重开一个x1 y1放到DFS里,而不是 x += mov,把x放到DFS里?
为什么???!
因为回溯的时候,x要再利用,本来应该是很好看出的,偏偏这次存的是string,我还debug半天为什么回溯string没有去掉后加的,因为for循环的初始string已经变动
代码放在笔记里
还漏考虑一个点…envelope拼两个不算完全重合…
小结
先发布,上课去了,晚点不确定有没有时间再写
这题真的磨我太久了,从字符到那个DFS坑…
“业精于勤荒于嬉,行成于思毁于随”
小蒟蒻一个月,冲省一!