三角形问题
三角形问题
时间限制: 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:已知一个单元格位置,请你马上说出单元格里存放的数。
这个问题描述如下:
要求:输入一个自然数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或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 }