题目:

0a408809a4904a5ea91376ede6bff5a8.jpeg

通过代码:

#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 如此反复 

 

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐