(中石油七)问题 B: 数字塔(水题)

问题 B: 数字塔

题目描述
FJ农场里每一只奶牛的脖子上挂着一个胸牌,胸牌上面印着一个倒三角数字塔,例如奶牛Bessie脖子上的胸牌印着:
74932
1325
457
92
1
你发现什么规律了吗?除了第一行的数字外,其他行的数字都等于其正上方的数字 + 其右上方数字的和,再除以10之后的余数。看不懂?除了第一行之外,我们用a[i][j]表示第i行第j列的数字,那么a[i][j] = (a[i-1][j]+a[i-1][j+1])%10。我们规定i从上到下是递增的,j从左往右是递增的。
所有奶牛的胸牌都符合这个规律!!除了第一行之外,a[i][j] = (a[i-1][j]+a[i-1][j+1])%10。
奶牛John是个粗心的家伙,它在玩耍的过程中,胸牌上面的数字大部分都弄丢了,John胸牌的每一行都只剩下一个数字!其他数字都丢失了。假如我们用‘?’来表示一个丢失的数字,那么John的胸牌可能变成这样了:
4??
?2
1
农夫知道后非常生气,打算不给John发圣诞礼物,除非John可以还原胸牌。John希望你能帮助它还原胸牌,你能做到呢?

输入
第一行,一个整数N,表示数字塔共有N行,第1行有N个数字,第2行有N-1个数字,第3行有N-2个数字,…第i行有N-i+1个数字,最后一行只有一个数字。这些数字都是0至9的数字。丢失的数字用?来代替。
输出
输出John的胸牌,也就是你要输出一个倒三角数字塔。请放心,答案肯定唯一。
样例输入 Copy
3
4??
?2
1
样例输出 Copy
457
92
1
提示
对于100%的数据,1<=N<=50。

这题有很多小伙伴没申清题意,“每一行都只剩下一个数字” 这一点没注意到,然后就是简单的递推了。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int main(){
    
    
	int n;
	cin>>n;
	getchar();
	char **arr = (char**)malloc(sizeof(char*) * n);
	for (int i = 0;i < n;i++){
    
    
        arr[i] = (char*)malloc(sizeof(char) * (i+1));
    }
    int **a = (int**)malloc(sizeof(int*) * n);
	for (int i = 0;i < n;i++){
    
    
        a[i] = (int*)malloc(sizeof(int) * (i+1));
    }
    int *b;
	b=(int*)malloc(n*sizeof(int));
//	char arr[n][n];
//	int a[n][n],b[n];
	for(int i=n-1;i>=0;i--){
    
    
		for(int j=0;j<=i;j++){
    
    
//			scanf("%c",&arr[i][j]);
			cin>>arr[i][j];
			if(arr[i][j]=='?')	a[i][j]=-1;
			else{
    
    
				a[i][j]=arr[i][j]-'0';
				b[i]=j;
			}
		}
//		if(i!=0)	getchar();
	}
	for(int i=0;i<n;i++){
    
    
		int x=b[i],y=b[i];
		for(int j=x+1;j<=i;j++){
    
    
			a[i][j]=a[i-1][j-1]-a[i][j-1];
			if(a[i][j]<0)	a[i][j]+=10;
		}
		for(int j=y-1;j>=0;j--){
    
    
			a[i][j]=a[i-1][j]-a[i][j+1];
			if(a[i][j]<0)	a[i][j]+=10;
		}
	}
	for(int i=n-1;i>=0;i--){
    
    
		for(int j=0;j<=i;j++)
			printf("%d",a[i][j]);
		putchar('\n');
	}
}

提一下这个代码。

int n;
cin>>n;
int a[n][n];

这当然是不规范的(虽然有些编译器上可以通过)。
所以得用C语言的malloc二维数组,当然C++的可以玩new。(这里不多说明了)

还有提一下“scanf(%c,&a);”这个无语的错误,每次用这个,得看看前后要不要用getchar();来过滤掉换行符,贼麻烦,过滤完了还容易输出超时,就这一个错误我检查了半小时,后来干脆用cin了。现在还是不知道这里错误的原因。还是C++的string,cin等等好用。

猜你喜欢

转载自blog.csdn.net/weixin_45606191/article/details/103433384