排版类问题

1062杨辉三角形

题目描述

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}

1392杨辉三角形 - 西北工业大学

题目描述

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}

1377旋转矩阵 - 北航

题目描述

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}

1216旋转方阵

题目描述

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}

1221旋转矩阵

题目描述

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}

1472 2048游戏

题目描述

Time Limit: 1000 ms
Memory Limit: 256 mb

2048游戏是一个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}