杨辉三角以及应用
问题描述
给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。
在杨辉三角中,每个数是它左上方和右上方的数的和。
示例:
输入: 5
输出:
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]
首先要弄清楚规律:
1.每一列的第一个元素和每一列的最后一个元素都是等于1.
2.当前行的元素大小等于上一行的左右两个元素之和.arr[i][j]=arr[i-1][j-1]+arr[i-1][j]
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main() {
printf("请输入要打印的行数: ");
int N = 0;
int row = 0;
int col = 0;
int arr[10][10] = {0};
scanf("%d",&N);
for (int row = 0; row < N; row++) {
for (int col = 0; col <= row; col++) {
if (col == 0 || row == col) {
arr[row][col] = 1;
} else {
arr[row][col] = arr[row - 1][col - 1] + arr[row - 1][col];
}
printf(" %d ", arr[row][col]);
}
printf("\n");
}
system("pause");
return 0;
}
运行结果:
C++ 代码:
class Solution {
public:
vector<vector<int>> generate(int numRows) {
vector<vector<int>> Mat;
Mat.resize(numRows);
for (int i=0;i < numRows;i++) {
Mat[i].resize(i+1);
for(int j=0;j<=i;j++) {
if(j == 0 || i == j) {
Mat[i][j]=1;
} else {
Mat[i][j] = Mat[i-1][j-1]+ Mat[i-1][j];
}
}
}
return Mat;
}
};
杨辉三角的应用1.走方格问题,(A->B)假如要从方格的开始走到方格的对角线,只能向下或者向右行走
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main() {
int m = 0;
int n = 0;
int arr[10][10] = { 0 };
printf("请输入方格的行和列: ");
scanf("%d %d", &m, &n);
int i = 0;
int j = 0;
for (i = 1; i <= m; i++) {
for (j = 1; j <= n; j++) {
if (j == 1 || i == 1) {
arr[i][j] = 1;
}
else {
arr[i][j] = arr[i - 1][j] + arr[i][j - 1];
}
}
}
printf("A到B的总路线为: %d\n", arr[m][n]);
system("pause");
return 0;
}
运行结果:
走方格问题拓展: 假如在A->B的途中有一个柱子,求A->B的总路线大小
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main() {
int m = 0;
int n = 0;
int x1 = 0;
int y1 = 0;
int arr[10][10] = { 0 };
printf("请输入方格的行和列: ");
scanf("%d %d", &m, &n);
printf("请输入柱子的坐标: ");
scanf("%d %d", &x1, &y1);
int i = 0;
int j = 0;
for (i = 1; i <= m; i++) {
for (j = 1; j <= n; j++) {
if (i == x1 && j == y1) {
continue;
}
if (j == 1 || i == 1) {
arr[i][j] = 1;
}
else {
arr[i][j] = arr[i - 1][j] + arr[i][j - 1];
}
}
}
printf("A到B的总路线为: %d\n", arr[m][n]);
system("pause");
return 0;
}
运行结果:
杨辉三角的应用2.杨辉三角与多项式求系数(a + b)^n
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
void Print(int arr[10][10],int n) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
int main () {
int i = 0, j = 0;
int n = 0;
int arr[10][10] = { 0 };
printf("请输入n的次方: ");
scanf("%d",&n);
for (i = 1; i <= n;i++) {
for (j = 1; j <= i;j++) {
if (i == 1 || j == 1) {
arr[i][j] = 1;
}
else {
arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
}
}
}
Print(arr,n);
system ("pause");
return 0;
}
运行结果:
杨辉三角的应用3:数塔问题
#include <stdio.h>
#include <stdlib.h>
int main () {
int arr[5][5] = {
{0,0,0,0,0},
{0,5,18,4,20},
{0,22,15,9,10},
{0,14,16,12,21},
{0,19,8,11,6},
};
for (int i = 1; i <= 4;i++) {
for (int j = 1; j <= 4;j++) {
if (arr[i][j-1] > arr[i-1][j]) {
arr[i][j] += arr[i][j - 1];
}
else {
arr[i][j] += arr[i - 1][j];
}
}
}
printf("从左上角移动到右下角的最大数字为: %d\n", arr[4][4]);
system ("pause");
return 0;
}
运行结果: