杭电OJ 2045 c++已通过
·
题目:

通过代码:
#include <iostream>
using namespace std;
int main()
{
int flag=1;
long long a[100] = { 0 };
a[1] = 3; a[2] = 6; a[3] = 6; a[4] = 18; a[5] = 30;
for (int i = 6; i <= 60; i++)
{
a[i] = a[i - 1] * 2 + 6 * flag;
flag *= -1;
}
int n;
while (cin >> n)
cout << a[n] << endl;
return 0;
}
这道题本来在纸上一点点算的,结果发现好麻烦,就写了个dfs求解:
#include <iostream>
using namespace std;
int a[100], ans;
const int M = 9;//好习惯
void dfs (int n)
{
if (n > M)//判断边界
{
if (a[1] == a[M]) return;//首尾不能相同
for (int i = 1; i <= M; i++)
{
if (a[i] == a[i + 1]) return;//相邻的也不能相同
}
ans++;
for (int i = 1; i <= M; i++)
cout <<" " << a[i];
cout << endl;
return;
}
for (int i = 1; i <= 3; i++)
{
a[n] = i;
dfs(n + 1);//向下递
}
}
int main()
{
dfs(1);
cout << ans;
return 0;
}
通过改变M发现前几项的值分别为
3 6 6 18 30 66 126 258
可以发现从第4项(18) 开始递推公式是a[i]=a[i-1]*2 +(-) 6
举个栗子:18=6*2+6 30=18*2-6
最开始是加6,然后变成减6 如此反复
更多推荐
所有评论(0)