题目描述
Time Limit: 1000 ms
Memory Limit: 256 mb提到杨辉三角形.大家应该都很熟悉.这是我国宋朝数学家杨辉在公元1261年著书《详解九章算法》提出的。 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 我们不难其规律: S1:这些数排列的形状像等腰三角形,两腰上的数都是1 S2:从右往左斜着看,第一列是1,1,1,1,1,1,1;第二列是,1,2,3,4,5,6;第三列是1,3,6,10,15;第四列是1,4,10,20;第五列是1,5,15;第六列是1,6……。 从左往右斜着看,第一列是1,1,1,1,1,1,1;第二列是1,2,3,4,5,6……和前面的看法一样。我发现这个数列是左右对称的。 S3:上面两个数之和就是下面的一行的数。 S4:这行数是第几行,就是第二个数加一。…… 现在要求输入你想输出杨辉三角形的行数n; 输出杨辉三角形的前n行.
输入描述:
1输入你想输出杨辉三角形的行数n(n<=20);当输入0时程序结束.
输出描述:
1对于每一个输入的数,输出其要求的三角形.每两个输出数中间有一个空格.每输完一个三角形换行.
输入样例:
15
27
30
输出样例:
11
21 1
31 2 1
41 3 3 1
51 4 6 4 1
61
71 1
81 2 1
91 3 3 1
101 4 6 4 1
111 5 10 10 5 1
121 6 15 20 15 6 1
1#include<iostream>
2using namespace std;
3
4int main(){
5 int n;
6 int num[21][21]={0};
7 num[1][1]=1;
8 for(int i=2;i<21;i++){
9 for(int j=1;j<=i;j++){
10 num[i][j]=num[i-1][j-1]+num[i-1][j];
11 }
12 }
13 while(cin>>n){
14 for(int i=1;i<=n;i++){
15 for(int j=1;j<=i;j++){
16 cout<<num[i][j]<<" ";
17 }
18 cout<<endl;
19 }
20 }
21}
题目描述
Time Limit: 1000 ms
Memory Limit: 256 mb输入n值,使用递归函数,求杨辉三角形中各个位置上的值。
输入描述:
1一个大于等于2的整型数n
输出描述:
1题目可能有多组不同的测试数据,对于每组输入数据,
2按题目的要求输出相应输入n的杨辉三角形。
输入样例:
16
输出样例:
11 1
21 2 1
31 3 3 1
41 4 6 4 1
51 5 10 10 5 1
1#include<iostream>
2using namespace std;
3
4int func(int a,int b){
5 if(b==1||b==a){
6 return 1;
7 }
8 else{
9 return func(a-1,b)+func(a-1,b-1);
10 }
11}
12
13int main(){
14 int n;
15 while(cin>>n){
16 for(int i=2;i<=n;i++){
17 for(int j=1;j<=i;j++){
18 cout<<func(i,j)<<" ";
19 }
20 cout<<endl;
21 }
22 }
23 return 0;
24}
题目描述
Time Limit: 1000 ms
Memory Limit: 256 mb任意输入两个9阶以下矩阵,要求判断第二个是否是第一个的旋转矩阵,如果是,输出旋转角度(0、90、180、270),如果不是,输出-1。 要求先输入矩阵阶数,然后输入两个矩阵,每行两个数之间可以用任意个空格分隔。行之间用回车分隔,两个矩阵间用任意的回车分隔。
输入描述:
1输入有多组数据。
2每组数据第一行输入n(1<=n<=9),从第二行开始输入两个n阶矩阵。
输出描述:
1判断第二个是否是第一个的旋转矩阵,如果是,输出旋转角度(0、90、180、270),如果不是,输出-1。
2如果旋转角度的结果有多个,则输出最小的那个。
输入样例:
13
21 2 3
34 5 6
47 8 9
57 4 1
68 5 2
79 6 3
输出样例:
190
1#include<iostream>
2using namespace std;
3
4
5bool judge0(int a[][9],int b[][9],int n){
6 for(int i=0;i<n;i++){
7 for(int j=0;j<n;j++){
8 if (a[i][j]!=b[i][j]){
9 return false;
10 }
11 }
12 }
13 return true;
14}
15
16bool judge90(int a[][9],int b[][9],int n){
17for(int i=0;i<n;i++){
18 for(int j=0;j<n;j++){
19 if (a[i][j]!=b[j][n-i-1]){
20 return false;
21 }
22 }
23 }
24 return true;
25}
26
27bool judge180(int a[][9],int b[][9],int n){
28for(int i=0;i<n;i++){
29 for(int j=0;j<n;j++){
30 if (a[i][j]!=b[n-i-1][n-j-1]){
31 return false;
32 }
33 }
34 }
35 return true;
36}
37
38bool judge270(int a[][9],int b[][9],int n){
39for(int i=0;i<n;i++){
40 for(int j=0;j<n;j++){
41 if (a[i][j]!=b[n-j-1][i]){
42 return false;
43 }
44 }
45 }
46 return true;
47
48}
49
50int main(){
51 int n;
52 int a[9][9];
53 int b[9][9];
54 while(cin>>n){
55 for(int i=0;i<n;i++){
56 for(int j=0;j<n;j++){
57 cin>>a[i][j];
58 }
59 }
60 for(int i=0;i<n;i++){
61 for(int j=0;j<n;j++){
62 cin>>b[i][j];
63 }
64 }
65 if (judge0(a,b,n)){
66 cout<<0<<endl;
67 }
68 else if (judge90(a,b,n)){
69 cout<<90<<endl;
70 }
71 else if (judge180(a,b,n)){
72 cout<<180<<endl;
73 }
74 else if (judge270(a,b,n)){
75 cout<<270<<endl;
76 }
77 else cout<<-1;
78 }
79
80}
题目描述
Time Limit: 1000 ms
Memory Limit: 256 mb打印出一个旋转方阵,见样例输出。
输入描述:
1输入一个整数n(1 <= n <= 20), n为方阵的行数。
输出描述:
1输出一个大小为n*n的距阵
输入样例:
15
输出样例:
11 16 15 14 13
22 17 24 23 12
33 18 25 22 11
44 19 20 21 10
55 6 7 8 9
1#include<iostream>
2#include<vector>
3#include<iomanip>
4using namespace std;
5int main(){
6 int n;
7 while(cin>>n){
8 vector<vector<int>> res(n,vector<int>(n,0));
9 int loop=n/2,mid=n/2;
10 int startx=0,starty=0;
11 int offset=1;
12 int cnt=1;
13 while(loop--){
14 int i=startx,j=starty;
15 for(;i<n-offset;i++){
16 res[i][j]=cnt++;
17 }
18 for(;j<n-offset;j++){
19 res[i][j]=cnt++;
20 }
21 for(;i>starty;i--){
22 res[i][j]=cnt++;
23 }
24 for(;j>startx;j--){
25 res[i][j]=cnt++;
26 }
27 startx++;
28 starty++;
29 offset++;
30 }
31 if(n%2==1){
32 res[mid][mid]=cnt;
33 }
34 for(int i=0;i<n;i++){
35 for(int j=0;j<n;j++){
36 cout<<left<<setw(3)<<res[i][j]<<" ";
37 }
38 cout<<endl;
39 }
40 }
41}
题目描述
Time Limit: 1000 ms
Memory Limit: 256 mb不知道为什么,哈特一直对矩阵情有独钟。 从以前的“哈特13的矩阵”、“神奇的矩阵”到现在的“旋转方阵”,Orz. 旋转方阵是一个有n行m列的矩阵,每个矩阵格子里有一个数字。 同样地,旋转方阵有3种操作: 操作1:将方阵顺时针旋转90度 操作2:将方阵沿纵向对称轴翻折 操作3:将方阵逆时针旋转90度 现在将对方阵进行k次操作,输出最后的方阵状态。
输入描述:
1多组输入数据,约20组 每组数据n+2行,第一行有三个整数n、m和k,1<=n<=100,1<=m<=100,1<=100<=k 第2行到n+1行每行有m个数字,表示方阵的初始状态,方阵格子数字大小不超过10000, 第n+2行有k个数字,表示k个操作的编号
输出描述:
1每组数据输出一个矩阵,表示最终的方阵状态。
输入样例:
12 3 1
21 2 3
34 5 6
41
输出样例:
14 1
25 2
36 3
1#include<iostream>
2#include<array>
3using namespace std;
4
5array<array<int,100>,100> trans1(array<array<int,100>,100>& res,int *height,int *width){
6 int tmp=*height;
7 array<array<int,100>,100> newres;
8 for(int i=0;i<*height;i++){
9 for(int j=0;j<*width;j++){
10 newres[j][*height-i-1]=res[i][j];
11 }
12 }
13 *height=*width;
14 *width=tmp;
15 return newres;
16}
17
18array<array<int,100>,100> trans3(array<array<int,100>,100>& res,int *height,int *width){
19 int tmp=*height;
20 array<array<int,100>,100> newres{{0}};
21 for(int i=0;i<*height;i++){
22 for(int j=0;j<*width;j++){
23 newres[*width-j-1][i]=res[i][j];
24 }
25 }
26 *height=*width;
27 *width=tmp;
28 return newres;
29}
30
31array<array<int,100>,100> trans2(array<array<int,100>,100>& res,int *height,int *width){
32 array<array<int,100>,100> newres{{0}};
33 for(int i=0;i<*height;i++){
34 for(int j=0;j<*width;j++){
35 newres[i][*width-j-1]=res[i][j];
36 }
37 }
38 return newres;
39}
40
41int main(){
42 int n,m,k;
43 while(cin>>n>>m>>k){
44 int height=n,width=m;
45 array<array<int,100>,100> res;
46 for(int i=0;i<height;i++){
47 for(int j=0;j<width;j++){
48 cin>>res[i][j];
49 }
50 }
51
52 int flag;
53 for(int i=0;i<k;i++){
54 cin>>flag;
55 if(flag==1){
56 res=trans1(res,&height,&width);
57 }else if(flag==2){
58 res=trans2(res,&height,&width);
59 }else if(flag==3){
60 res=trans3(res,&height,&width);
61 }
62 }
63
64 for(int i=0;i<height;i++){
65 for(int j=0;j<width;j++){
66 cout<<res[i][j]<<" ";
67 }
68 cout<<endl;
69 }
70 }
71}
题目描述
Time Limit: 1000 ms
Memory Limit: 256 mb2048游戏是一个4*4矩阵,用户可以按上下左右4个方向键让所有的方块向同一个方向运动,两个相同数字方块撞一起之后合并成为他们的和,每次操作之后随即生成一个2或者4.
合并规则:相邻会碰撞的两个数字合并且一个位置只会触发一次合并,并且优先合并移动方向顶部的位置
比如:2 2 2 2行向右合并为0 0 4 4
0 2 2 2行向右合并为0 0 2 4
输入描述:
1输入第一行是用户按下的方向键,其中1,2,3,4分表代表上、下、左、右键;
2接下来是一个4*4的矩阵,空格分割,0代表该位置没有数字.
输出描述:
1输出用户按下该方向键后生成的数字矩阵.
2不考虑随机生成的数字.
输入样例:
11
20 0 0 2
30 0 0 2
40 0 4 8
50 0 4 8
输出样例:
10 0 8 4
20 0 0 16
30 0 0 0
40 0 0 0
1#include<iostream>
2#include<array>
3using namespace std;
4int main(){
5 int flag;
6 while(cin>>flag){
7 array<array<int,4>,4> res;
8 for(int i=0;i<4;i++){
9 for(int j=0;j<4;j++){
10 cin>>res[i][j];
11 }
12 }
13 if(flag==1){
14 for(int j=0;j<4;j++){
15 for(int i=0,k;i<4;i++){
16 if(res[i][j]!=0){
17 int tmp=res[i][j];
18 for(k=i-1;k>=0;k--){
19 if (res[k][j]!=0){break;}
20 }
21 res[i][j]=0;
22 res[k+1][j]=tmp;
23 if(k>=0&&res[k][j]==res[k+1][j]){
24 res[k][j]*=2;
25 res[k+1][j]=0;
26 }
27 }
28 }
29 }
30 }else if(flag==2){
31 for(int j=0;j<4;j++){
32 for(int i=3,k;i>=0;i--){
33 if(res[i][j]!=0){
34 int tmp=res[i][j];
35 for(k=i+1;k<=3;k++){
36 if (res[k][j]!=0){break;}
37 }
38 res[i][j]=0;
39 res[k-1][j]=tmp;
40 if(k>=0&&res[k][j]==res[k-1][j]){
41 res[k][j]*=2;
42 res[k-1][j]=0;
43 }
44 }
45 }
46 }
47 }else if(flag==3){
48 for(int j=0;j<4;j++){
49 for(int i=0,k;i<4;i++){
50 if(res[j][i]!=0){
51 int tmp=res[j][i];
52 for(k=i-1;k>=0;k--){
53 if (res[j][k]!=0){break;}
54 }
55 res[j][i]=0;
56 res[j][k+1]=tmp;
57 if(k>=0&&res[j][k]==res[j][k+1]){
58 res[j][k]*=2;
59 res[j][k+1]=0;
60 }
61 }
62 }
63 }
64 }else if(flag==4){
65 for(int j=0;j<4;j++){
66 for(int i=0,k;i<4;i++){
67 if(res[j][i]!=0){
68 int tmp=res[j][i];
69 for(k=i+1;k<=3;k++){
70 if (res[j][k]!=0){break;}
71 }
72 res[j][i]=0;
73 res[j][k-1]=tmp;
74 if(k>=0&&res[j][k]==res[j][k-1]){
75 res[j][k]*=2;
76 res[j][k-1]=0;
77 }
78 }
79 }
80 }
81 }
82
83 for(int i=0;i<4;i++){
84 for(int j=0;j<4;j++){
85 cout<<res[i][j]<<" ";
86 }
87 cout<<endl;
88 }
89 }
90 return 0;
91}