递归的一般流程
- stern-brocot树:中序遍历输出就是按从小到大顺序的最简分数
【算法】什么是Stern-Brocot tree?香不香,味道还可以吗?_哔哩哔哩_bilibili
#include <bits/stdc++.h>
using namespace std;
int n;
void dfs(int a, int b, int c, int d) {
if (b + d > n) return;
dfs(a, b, a + c, b + d);
cout << a + c << "/" << b + d << endl;
dfs(a + c, b + d, c, d);
}
int main() {
cin >> n;
cout << "0/1" << endl;
dfs(0, 1, 1, 1);
cout << "1/1" << endl;
}
#include <bits/stdc++.h>
using namespace std;
string str;
int k = 0;
// 任务就是计算括号里的,看成整体
int dfs() {
// num是当前在维护的长度
int num = 0, res = 0;
while (k < str.length()) {
if (str[k] == '(') {
k++;
num += dfs();
} else if (str[k] == ')') {
k++;
// return res;
break;
} else if (str[k] == '|') {
k++;
res = max(res, num);
num = 0;
} else {
num++;
k++;
}
}
return max(num, res);
}
int main() {
cin >> str;
cout << dfs();
}
- 注意区分vector<int> a[2] 和 vector<int> a(2)
int a[2] //两个int
vector<PII> a[2] //两个vector<PII>
vector<PII> a(2) //一个vector的大小为2,只能存两个PII
- 进入dfs前有条件(=='X')
#include <bits/stdc++.h>
using namespace std;
const int N = 55;
int m, n;
char g[N][N];
typedef pair<int, int> PII;
vector<PII> points[2]; // 表示两个vector,不是(2)
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1}; // 偏移量
void dfs(int a, int b, vector<PII>& points) {
// 是有条件才进dfs的,所以直接标记
g[a][b] = '.';
points.push_back({a, b});
for (int i = 0; i < 4; i++) {
int x = a + dx[i], y = b + dy[i];
if (g[x][y] == 'X' && x < n && x >= 0 && y < m && y >= 0) {
dfs(x, y, points);
}
}
}
int main() {
cin >> n >> m;
for (int i = 0; i < n; i++) {
cin >> g[i];
}
int k = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (g[i][j] == 'X') {
dfs(i, j, points[k++]);
}
}
}
int ans = 1e8;
for (auto i : points[0]) {
for (auto j : points[1]) {
ans = min(ans, abs(i.first - j.first) + abs(i.second - j.second) - 1);
}
}
cout << ans;
}