首页 > 试题广场 >

杨辉三角的变形

[编程题]杨辉三角的变形
  • 热度指数:149829 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

以上三角形的数阵,第一行只有一个数1,以下每行的每个数,是恰好是它上面的数、左上角数和右上角的数,3个数之和(如果不存在某个数,认为该数就是0)。

求第n行第一个偶数出现的位置。如果没有偶数,则输出-1。例如输入3,则输出2,输入4则输出3,输入2则输出-1。

数据范围:


输入描述:

输入一个int整数



输出描述:

输出返回的int值

示例1

输入

4

输出

3
def Triangle(n):
    temp = [0, 0]
    if n == 1:
        a = [1]
        return a
    else:
        temp = temp + Triangle(n-1) + temp
#         print(temp)
        result = [temp[i] + temp[i+1] + temp[i+2] for i in range(2 * n - 1)]
        return result
while True:
    try:
        n = int(input())
        result = Triangle(n)
        for i,j in enumerate(result, start=1):
            if j % 2 == 0:
                print(i)
                break
            elif i == len(result):
                print(-1)
    except:
        break
发表于 2021-09-11 21:29:04 回复(2)
import java.util.Scanner;


public class YHTriangle {

public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
while(in.hasNext()){
int num=in.nextInt();
int[][] ***=new int[num][2*num+1];
***[0][num]=1;
for(int i=0;i<num;i++){
for(int j=0;j<2*num+1;j++){
if(j==0||j==2*num||i==0&&j!=(num)){
***[i][j]=0;
}else if(i>0&&j!=0&&j!=2*num){
***[i][j]=***[i-1][j-1]+***[i-1][j+1]+***[i-1][j];
}
}
}
for(int i=1;i<2*num+1;i++){
if((***[num-1][i])%2==0){
System.out.println(i);
break;
}else if(i==2*num&&***[num][i]%2!=0){
System.out.println("-1");
}else{
continue;
}
}
}

}

}

发表于 2016-06-01 21:47:37 回复(0)
while True:
    try:
        n = int(input())
        if n ==1&nbs***bsp;n ==2:
            print(-1)
        elif n %2 != 0: # 经过观察,所有行的第二个数和倒数第二个数为上一行对应位置加1递增,则奇数行的第一个偶数就是第二个数
            print(2)
        else: # n=4,6,8,10... 经过观察,偶数行n除去头尾两个1之外共需计算2个由2数相加得到的2-th数,2n-1-4个由3个数相加得到的数
            preRow = [1,2,3,2,1] # 第三行起始数据
            YangTriangle = []
            for i in range(n-3):
                secondNum = preRow[0] + preRow[1]
                if secondNum %2 ==0 and i==n:
                    print(2)
                else:
                    row = [1] * (2*(4+i) - 1)
                    # 第i行需要计算3+i个3个相加的数
                    for j in range(2*(4 + i) - 5):
                        row[j+2] = preRow[j] + preRow[j+1] + preRow[j+2]
                    row[1],row[-2] = secondNum,secondNum
                    YangTriangle.append(row)

                    # update preRow
                    preRow = row

            # find first even number in the n-th row
            for ind, x in enumerate(row):
                if x %2 ==0:
                    print(ind+1)
                    break


    except:
        break
编辑于 2020-02-07 21:12:34 回复(0)
import sys

while True:
    try:
        lines = int(sys.stdin.readline())
        list = []
        list.append([1,])
        list.append([1, 1, 1])
        for line in range(2, lines):
            i = 1 + 2 * line

            list.append([0] * i)
            for j in range(i):
                if j == 0:
                    list[line][j] = list[line - 1][0]
                elif j == 1:
                    list[line][j] = list[line - 1][0] + list[line - 1][1]
                elif 1 < j < i - 2:
                    list[line][j] = list[line - 1][j-2] + list[line - 1][j-1] + list[line - 1][j]
                elif j == i - 2:
                    list[line][j] = list[line - 1][i-3] + list[line - 1][i-4]
                elif j == i - 1:
                    list[line][j] = list[line - 1][i-3]

        # print(list)
        for i in range(len(list[lines - 1])):
            if list[lines - 1][i] % 2 == 0:
                print(i + 1)
                break


    except:
        break
分析上一行与下一行的关系,将每一行的数值存起来。然后遍历最后一行,即可。
发表于 2019-11-18 19:12:44 回复(1)
1
1,1
1,2,1
1,3,3,1
1,4,6,4,1
1,5,10,10,5,1
1,6,15,20,15,6,1
1,7,21,35,35,21,7,1
1,8,28,56,70,56,28,8,1
1,9,36,84,126,126,84,36,9,1
1,10,45,120,210,252,210,120,45,10,1
1,11,55,165,330,462,462,330,165,55,11,1

var line;
while ((line = readline())) {
  console.log(fun(parseInt(line)));
}
// 每一行的第一列都是1,可以忽略
// 观察可得从第三行的第二列开始,就成奇偶的
// 那么思路就出现了

function fun(row) {
  if (row == 1 || row== 2) {
    return -1;
  } else if (row % 2 == 1) {
    return 2;
  } else if (row % 4 == 0) {
    return 3;
  } else {
    return 4;
  }
}



发表于 2022-05-25 00:04:53 回复(0)
用递归的方式计算一半的杨辉三角
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextInt()) {
            int line = sc.nextInt();
            System.out.println(method(line));
        }
    }
    
    private static int method(int row) {
        // 当 line 小于 2 时,直接返回 -1
        if (row < 2) {
            return -1;
        }
        // 每一行第二个数为 n - 1,因此如果第二个数为偶数,就无须再进行,直接返回结果
        if ((row - 1) % 2 == 0) {
            return 2;
        }
        // 其余情况从每行第三个数开始使用递归计算每个位数上的数,如果是偶数则直接返回
        for (int i = 3; i <= row; i++) {
            int num = dataCalc(row, i);
            if (num % 2 == 0) {
                return i;
            }
        }
        
        return -1;
    }
    
    private static int dataCalc(int row, int col) {
        if (col < 2) {
            return col;
        }

        if (col == 2) {
            return row -  1;
        }
        
        if (row == col) {
            return 2 * dataCalc(row - 1, col - 2) + dataCalc(row - 1, col - 1);
        } else {
            return dataCalc(row - 1, col -2) + dataCalc(row - 1, col - 1) + dataCalc(row - 1, col);
        }
    }
}


发表于 2021-09-10 21:03:09 回复(3)
while True:
    try:
        n=int(input())
        if n==1 or n==2:
            i=-1
        elif (n-2) % 2 == 1:
            i=2
        elif n % 4 == 0:
            i=3
        else:
            i=4
        print(i)
    except EOFError:
        break
发表于 2021-08-29 11:19:19 回复(0)
把一整行都求出来看:
import sys

def yanghui(now, line = [1], n = 1):
    if n == now:
        return line
    else:
        n += 1
        nextLine = [1, 1]
        if n == 2:
            nextLine = [1, 1, 1]
        elif n > 2:
            nextLine = [1, n-1, n-1, 1]
        for i in range(2, 2 * n - 3):
            nextLine.insert(i, sum(line[i - 2:i + 1]))
        return yanghui(now, nextLine, n)
        
for i in sys.stdin:
    i = int(i.strip())
    line = yanghui(i)
    notfind = True
    for index in range(i):
        if line[index]%2 == 0:
            print(index + 1)
            notfind = False
            break
    if notfind:
        print(-1)


发表于 2021-08-04 10:01:28 回复(0)
看到答案 我吐了 自己写了这么多
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            int n = new Integer(scanner.nextLine());
            List<Integer[]> numList = new ArrayList<>();
            //知道N就知道最多一行的数字的数量为2n-1了 所以直接让每一行都是2n-1个数 
            //初始化第一行 最中间那个数为1 其余为0
            Integer[] nums0 = new Integer[2 * n - 1];
            Arrays.fill(nums0, 0);
            numList.add(nums0);
            nums0[n - 1] = 1;
            boolean flag = true;
            //从第二行开始遍历
            for (int i = 1; i < n; i++) {
                //每一行都是2n-1行
                Integer[] nums = new Integer[2 * n - 1];
                Arrays.fill(nums, 0);
                //取出上一行
                Integer[] pre = numList.get(i - 1);
                //因为是对称的 所以只用遍历到第n-1个数
                for (int j = 0; j < n; j++) {
                    //首尾两个数需要 特殊处理一下 
                    if(j==0){
                        nums[j] = pre[j] + pre[j + 1];
                        nums[2 * n - 2 - j] = pre[2 * n - 3 - j] + pre[2 * n - 2 - j];
                    }
                    //其余每一位都是上一层的三个数求和
                    else {
                        nums[j] = pre[j - 1] + pre[j] + pre[j + 1];
                        //第N行
                        if (i == n - 1) {
                            //当出现偶数时 打印并退出循环
                            if ((nums[j] & 1) == 0) {
                                System.out.println(j + 1);
                                flag = false;
                                break;
                            }
                        }
                        //放这里纯为了少算一次
                        nums[2 * n - 2 - j] = pre[2 * n - 3 - j] + pre[2 * n - 2 - j] + pre[2 * n - 1 - j];
                    }
                }
                numList.add(nums);
            }
            if (flag) System.out.println(-1);
        }
    }
}


编辑于 2021-05-02 20:10:58 回复(0)
/*
思路:
先把题目看懂,知道每一行怎么写出来。
这个左上角和左下角,是对于这个元素而言的。

其实只需要写左边几个,然后继续往下面行去写就行了

然后总结规律
*/
import java.util.*;

public class Main{
    
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        
        while(in.hasNextInt()){
            int n = in.nextInt();
            if(n == 1 || n == 2){
                System.out.println(-1);
                continue;
            }
            int temp = (n - 2) % 4;
            int res = 0;
            if(temp == 1 || temp == 3){
                res = 2;
            }else if(temp == 2){
                res = 3;
            }else if(temp == 0){
                res = 4;
            }
            System.out.println(res);
        }
        
    }
    
}


编辑于 2021-04-20 21:36:13 回复(0)
import java.util.Scanner;
//杨辉三角规律                                    行号    第一个偶数在该行第几个
//                    1                           1             -1
//                1   1   1                       2             -1
//            1   2   3   2   1                   3              2
//         1  3   6   7   6   3   1               4              3
//      1  4  10  16  19  16  10  4  1            5              2
//   1  5  15 30  45  51  45  30  15 5  1         6              4
//
//  首个偶数在该行第几个的规律: -1 -1 (2 3 2 4)···(2 3 2 4)

public class MainHJ53 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[] res = new int[]{2,3,2,4};
        while(sc.hasNext()){
            int n = sc.nextInt();
            System.out.println(res[(n+1)%4]);
        }
    }
}

发表于 2021-03-29 16:58:07 回复(0)
好家伙,找规律,面向答案编程?
#include<iostream>
#include<vector>
using namespace std;


int main()
{
    int n;
    while(cin>>n)
    {
        if(n<3)    {cout<<-1<<endl;}
        else
        {
            if(n%2==1)    {cout<<2<<endl;}
            else if(n%4==0)    {cout<<3<<endl;}
            else    {cout<<4<<endl;}
        }
    }
    return 0;
}


发表于 2021-03-10 17:44:30 回复(0)
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        Main a = new Main();
        while (scanner.hasNext()){
            int row = Integer.parseInt(scanner.nextLine());
            System.out.println(a.firstEven(row));
        }
    }
    public int firstEven(int row){
        if ((row == 1 || row == 2)){
            return -1;
        }
        int result = row % 2 != 0 ? 2 : (row % 4 == 0 ? 3 : 4);
        return result;
    }
}

发表于 2021-01-15 14:15:25 回复(0)
//归纳法 #include<iostream>
using namespace std;

int main()
{
    int n;
    while(cin>>n)
    {
        if(n<=2)
            cout<<-1<<endl;
        else if(n%2 == 1)
            cout<<2<<endl;
        else if(n%4 == 0)
            cout<<3<<endl;
        else
            cout<<4<<endl;
    }
    return 0;
}

编辑于 2021-01-05 22:39:17 回复(0)
/*  本题观察数据有规律可循
                                           1
                                      1    1    1
                                 1    2    3    2    1    
                            1    3    6    7    6    3    1
                       1    4    10   16   19   16   10    4    1
                  1    5    15   30   45   51   45   30    15   5   1
             1    6    21   50   90   126  141  126  90    50   21   6    1
         1   7    28   77   161  266  357  393   
     1   8   36   112
 1   9   45  156
*/
#include <iostream>
using namespace std;
int main(void)
{
    long long num=0;
    while(cin>>num)
    {
        if(num<=2)//不存在偶数
            cout<<"-1"<<endl;
        else
        {
            
            if(num%2!=0)//奇数行第一个偶数肯定为第二个值
            {
               cout<<"2"<<endl; 
            }
            else
            {    //如果是偶数行,该行数如果整除2后的值为偶数则输出3,否则输出4
                if((num/2)%2==0)
                    cout<<"3"<<endl; 
                else
                    cout<<"4"<<endl; 
                    
            }
        }
        
    }
    return 0;
}
发表于 2020-06-18 18:03:49 回复(0)
按照题目意思,可以发现第n行有2n -1个元素,第i,j元素等于上一行第j -2,j -1,j三列元素之和,每一行的第一列和最后一列都为1。
#include <iostream>
#include <vector>
using namespace std;
int main(){
    int n;
    while(cin >> n){
        vector<vector<int>> vv(n);
        for(int i = 0; i < n; ++i){
            vv[i].resize(i * 2 + 1, 1);
        }
        for(int i = 2; i < n; ++i){
            for(int j = 1; j < i * 2; ++j){
                if(j == 1){
                    vv[i][j] = vv[i - 1][j - 1] + vv[i - 1][j];
                }
                else if(j == i * 2 - 1){
                    vv[i][j] = vv[i - 1][j - 2] + vv[i - 1][j - 1];
                }
                else{
                    vv[i][j] = vv[i - 1][j - 2] + vv[i - 1][j - 1] + vv[i - 1][j];
                }
            }
        }
        int i = 0;
        for(; i < (n - 1) * 2 + 1; ++i){
            if(vv[n - 1][i] % 2== 0){
                cout << i + 1 << endl;
                break;
            }
        }
        if(i == (n - 1) * 2 + 1){
            cout << -1 << endl;
        }
    }
    return 0;
}

发表于 2020-06-12 16:57:37 回复(0)
#include <stdio.h>
(737)#include <stdlib.h>
// 奇数+奇数=偶数 奇数+偶数=奇数
// 偶数+偶数=偶数
// 奇+奇+奇 = 奇
// 偶+偶+偶 = 奇
// 这种方法也可以得出当前值
#define N (1000) // 不符合题意n <= 1000000000,但是通过了所有示例
int dp[N][N + 4] = { 0 };
int main(void)
{
	int n = 0;
	
	while (scanf("%d",&n)!=EOF)
	{
		
        //int dp[n+3][n+3];
		for (int i = 0; i <= n; i++)
		{
			dp[i][0] = 0; //偶数
			dp[i][1] = 1; //奇数
		}
		for (int i = 1; i <= n; i++)
		{
			for (int j = 2; j <= i+2; j++)
			{
				dp[i][j] = dp[i - 1][j - 2] + dp[i - 1][j - 1] + dp[i - 1][j];
				if (dp[i][j] == 2)
					dp[i][j] = 0;
				else if (dp[i][j] == 3)
					dp[i][j] = 1;
			}
		}
		for (int i = 1; i <= n; i++)
		{
			if (dp[n-1][i] == 0)
			{
				printf("%d\n", i);
				break;
			}
		}
	}
    return 0;
}

发表于 2020-02-23 19:53:27 回复(0)
//找规律的过程稍微麻烦了一点,注意边界条件,然后n-1那些条件再做的时候可能还是会看不懂
//大意提示:存储一半的表,然后根据计算公式由上一行得到下一行的值
#include<iostream>
using namespace std;
int main(){
    int n;
    while(cin>>n){
        if(n==1||n==2){
            cout<<"-1"<<endl;
        }
        else{
            int** a=new int*[n];
            for(int i=0;i<n;i++)
                a[i]=new int[n];
            for(int i=0;i<n-1;i++)
                a[0][i]=0;
            a[0][n-1]=1;
            for(int i=1;i<n;i++){
                for(int j=0;j<n-i-1;j++)
                    a[i][j]=0;
                a[i][n-i-1]=1;
                for(int j=n-i;j<n-1;j++)
                    a[i][j]=a[i-1][j-1]+a[i-1][j]+a[i-1][j+1];
                a[i][n-1]=2*a[i-1][n-2]+a[i-1][n-1];
            }
            bool judge=1;
            for(int i=0;i<n;i++)
                if(a[n-1][i]%2==0){
                    cout<<i+1<<endl;
                    judge=0;
                    break;
                }
            if(judge)
                cout<<"-1"<<endl;
        }
    }
}

发表于 2020-01-07 22:46:07 回复(0)
#include<iostream>
#include<string>
#include<vector>
using namespace std;

int my_***(int n)
{
    int result=-1;
    vector<vector<int>> vec(n);
    for(int i=0;i<n;i++)
    {
        vec[i].resize(2*i+3);
        vec[i][0]=vec[i][2*i+2]=0;
        vec[i][1]=vec[i][2*i+1]=1;
    }
    for(int i=1;i<vec.size();i++)
    {
        for(int j=2;j<vec[i].size()-2;j++)
        {
            vec[i][j]=vec[i-1][j]+vec[i-1][j-1]+vec[i-1][j-2];
        }
    }
    
    
    for(int i=2;i<vec[n-1].size()-2;i++)
    {
        if(vec[n-1][i]%2==0)
        {
            result=i;
            break;
        }
    }
    return result;
}


int main()
{
    int N;
    while(cin>>N)
    {
        
        cout<<my_***(N)<<endl;
    }
    return 0;
}
发表于 2019-05-07 13:40:01 回复(0)
/*利用矩阵生成杨辉三角矩阵的变形,然后在最后一行查找*/
def getIndex(n):
    matrix = [[0 for j in range(2*n - 1)] for i in range(n)]
    matrix[0][n-1] = 1
    for i in range(1,n):
        for j in range(1, 2*n-2):
            matrix[i][j] = matrix[i-1][j-1] + matrix[i-1][j] + matrix[i-1][j+1]
    matrix[n-1][0] = 1
    matrix[n-1][2*n-2] = 1
    for k in range(2*n-2):
        if matrix[n-1][k] % 2 == 0:
            return k+1
    return -1

while True:
    try:
        n = int(input())
        print(getIndex(n))
    except:
        break

发表于 2018-08-29 21:30:38 回复(1)

问题信息

难度:
420条回答 32265浏览

热门推荐

通过挑战的用户

查看代码