先贴个题目:
以及原题链接:1208. 翻硬币 - AcWing题库https://www.acwing.com/problem/content/1210/
这题直接二维变一维,比费解的开关简单多了,规律一样的,不难发现,前一个硬币选择和右边一起翻和后一个硬币选择和左边一起翻结果是一样的,所以直接指定一个方向,然后再观察到第一个硬币翻或不翻直接决定了第二个硬币翻不翻,然后第二个决定第三个,直接从第一个开始递推,然后解决。
下面是我的代码:
#include <iostream>
using namespace std;
char map[120], list[120];
int main()
{
cin >> map >> list;
int len = 0;
for (;;)
if (map[len] != '\0')
len++;
else
break;
len++;
int step = 0, sign1 = 1, sign2 = 1;
for (int i = 0; i < len; ++i)
{
if (map[i] != list[i])
{
step++;
sign2 = 1;
if (map[i] == '*')
map[i] = 'o';
else
map[i] = '*';
if (i + 1 == len)
{
sign1 = 0;
break;
}
if (map[i + 1] == '*')
map[i + 1] = 'o';
else
map[i + 1] = '*';
}
for (int j = 0; j < len; ++j)
if (map[j] != list[j])
{
sign2 = 0;
break;
}
if (sign2)
break;
}
if (sign1 && sign2)
cout << step;
return 0;
}
顺带一提,以后读题后思考,思路放前面,代码容易出现错误的地方放代码后面,这样便于阅读一点(大概)。
by————2024.1.30刷题记录