【牛客】[编程题]iNOC产品部-杨辉三角的变形 C++

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. 先定义一个二维数组,这里定义的二维数组多两行
  2. 因为每次都是上方,左上方,右上方的数字加和
  3. 所以多定义两行可以避免一些不必要的特殊处理
  4. 将第一行最中间的数字置为1
  5. 然后开始对每一行的数字加和操作
  6. 最后遍历第n行,然后找第一个为偶数的数字
  7. 否则返回-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;
}

猜你喜欢

转载自blog.csdn.net/weixin_43967449/article/details/106877018