A汉诺塔
https://www.matiji.net/exam/brushquestion/9/4498/F16DA07A4D99E21DFFEF46BD18FF68AD?from=1
题意:A,B,C,三个杆子,现在要将A上的杆子移动到C上:
1.每次只能移动一个圆盘
2.大盘不能叠在小盘上面
求对于第 k 步后而言,汉诺塔此时每个圆盘处于哪个杆子。
对于n-1个,需要从A借助C全部移动到B杆上
对于第n个,直接移动到C上
对于n-1个,需要从B借助A全部移动到C杆上
string s;
char ans[100005];
int n;
//a,b,c分别是 起始杆子,辅助杆子,目标杆子
void dfs(char a, char b, char c, int k)
{
if(k == 0) return;
//当该位置状态是0的时候,
//表示需要从A借助C全部移动到B杆上
if(s[n - k] != '1')
{
ans[k] = a;
dfs(a, c, b, k - 1);
}
//当该位置状态是1的时候,表示我们的目标杆子是C
else
{
ans[k] = c;
dfs(b, a, c, k - 1);
}
}
int main()
{
cin >> n;
cin >> s;
char a = 'A', b = 'B', c = 'C';
dfs(a, b, c, n);
for(int i = 1; i <= n; i ++)
cout << ans[i];
return 0;
}
D括号
https://www.matiji.net/exam/brushquestion/12/4498/F16DA07A4D99E21DFFEF46BD18FF68AD?from=1
题意:长度为 N 的括号。经过检查,我们发现要让该串括号匹配,至多需要翻转其中一个括号。现在需要你帮忙计算有多少个位置的括号翻转后,可以让整个括号串匹配。如果括号串原本就匹配则输出0。
l: '(', r: ')',而且 |l - r| <= 1
我们可以知道有三种情况:
① l = r :直接输出 0
② l < r : 我们需要翻转的括号一定是), 在r > l之前的)所在的位置都可以
③ l > r : 这种情况我们需要倒序来找,那不如将s整体翻转,使它变成②的那种情况,同理求解即可
int main()
{
string s; cin >> s;
int l = 0, r = 0;
for(int i = 0; i < s.size(); i ++)
if(s[i] == '(') l ++;
else r ++;
if(l == r) cout << 0 << endl;
else
{
if(l > r)
{
reverse(s.begin(), s.end());
for(int i = 0; i < s.size(); i ++)
if(s[i] == '(') s[i] = ')';
else s[i] = '(';
}
l = 0, r = 0;
int ans = 0;
for(int i = 0; i < s.size(); i ++)
{
if(r > l) break;
if(s[i] == ')') ans ++, r ++;
else l ++;
}
cout << ans << endl;
}
return 0;
}