三角形问题

 三角形问题

时间限制: 1 Sec  内存限制: 128 MB

题目描述

小W前不久与同学们讨论一些经典二维图形打印问题,现在把一道三角形的拓展问题拿来考考正在学编程的你,不知你能否解决。
这个问题描述如下:
要求:输入一个自然数n,表示行数,如下图为n=9的输出图形。输出n行,其中第一行有n个数字,第二行有n-1个,...,第n行只有一个数字;且第一行第一个为1,以后的走向是从右上到左下,直到这样的走向不能再进行结束。

现在我们把上图所示的上三角形存放到二维数组a中,每个数对应一个固定的位置,比如1存放在a[1,1]单元格里,19存放在a[4,3]单元格里,45存放在a[9,1]单元格里。问题1:已知某单元格里的数,请你马上输出存放它的单元格位置。问题2:已知一个单元格位置,请你马上说出单元格里存放的数。

输入

共2行。
第1行是一个整数1或2,分别表示要回答的是问题1还是问题2。
第2行一个整数或两个用空格隔开的整数。

输出

一行,一个整数或两个用空格隔开的整数。

样例输入

【样例1】
1
19
【样例2】
2
4 3

样例输出

【样例1】
4 3
【样例2】
19

提示

100%的输入数据保证n≤5000。

题解

可以先算出第一行的所有数,f[1][i]=i*(i-1)+1,接下来的是f[i][j]=f[i-1][j+1]+1,把三角形中的所有数算出来,用二维数组存起来,暴力查找就行了。

 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std;
 4 const int N=5005;
 5 int v,x,y,a[N][N];
 6 int main()
 7 {
 8     scanf("%d",&v);
 9     if(v==1)
10         scanf("%d",&x);
11     else scanf("%d%d",&x,&y);
12     for(int i=1;i<=5000;i++)
13     {
14         a[1][i]=i*(i-1)/2+1;
15         if(v==1&&a[1][i]==x)
16         {
17             printf("%d %d\n",1,i);
18             return 0;
19         }
20         if(v==2&&x==1&&y==i)
21         {
22             printf("%d\n",a[1][i]);
23             return 0;
24         }
25     }
26     for(int i=2;i<=5000;i++)
27         for(int j=1;j<=5000-i+1;j++)
28         {
29             a[i][j]=a[i-1][j+1]+1;
30             if(v==1&&a[i][j]==x)
31             {
32                 printf("%d %d\n",i,j);
33                 return 0;
34             }
35             if(v==2&&x==i&&y==j)
36             {
37                 printf("%d\n",a[i][j]);
38                 return 0;
39             }
40         }
41     return 0;
42 }
View Code

 

posted @ 2020-02-01 19:06  Johnny-English  阅读(547)  评论(0编辑  收藏  举报