1.题目描述
链接
https://www.nowcoder.com/questionTerminal/8ef655edf42d4e08b44be4d777edbf43
1 1 1 1 1 2 3 2 1 1 3 6 7 6 3 1
以上三角形的数阵,第一行只有一个数1,以下每行的每个数,是恰好是它上面的数,左上角数到右上角的数,3个数之和(如果不存在某个数,认为该数就是0)。
求第n行第一个偶数出现的位置。如果没有偶数,则输出-1。例如输入3,则输出2,输入4则输出3。
输入n(n <= 1000000000)
2.思路解析
- 先定义一个二维数组,这里定义的二维数组多两行
- 因为每次都是上方,左上方,右上方的数字加和
- 所以多定义两行可以避免一些不必要的特殊处理
- 将第一行最中间的数字置为1
- 然后开始对每一行的数字加和操作
- 最后遍历第n行,然后找第一个为偶数的数字
- 否则返回-1
3.代码实现
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n = 0;
while (cin >> n)
{
// 定义一个二维数组,n行,2*n + 1 列(这本应该是2*n - 1列)
vector<vector<int>> vv(n, vector<int>(2 * n + 1, 0));
// 将第一行最中间的数字置为1
vv[0][(2 * n + 1) / 2] = 1;
// 从第二行开始,每次都是上面的j,j - 1,j - 2来进行加和
for (int i = 1; i < n; i++)
{
for (int j = 1; j < 2 * n; j++)
{
vv[i][j] = vv[i - 1][j - 1] + vv[i - 1][j] + vv[i - 1][j + 1];
}
}
int i = 1;
// 遍历第n行,遇到第一个偶数直接打印下标,然后break
for (i; i < 2 * n + 1; i++)
{
if (vv[n - 1][i] % 2 == 0)
{
cout << i << endl;
break;
}
}
// 如果此行没有偶数,直接打印-1
if (i == 2 * n + 1)
cout << -1 << endl;
}
return 0;
}