• 2023-2024-2 高级语言程序设计-二维数组


    7-1 矩阵运算

    给定一个n×n的方阵,本题要求计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。副对角线为从矩阵的右上角至左下角的连线。

    输入格式:

    输入第一行给出正整数n(1

    输出格式:

    在一行中给出该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。

    输入样例:

    1. 4
    2. 2 3 4 1
    3. 5 6 1 1
    4. 7 1 8 1
    5. 1 1 1 1

    输出样例:

    35
    1. #include<bits/stdc++.h>
    2. using namespace std;
    3. int main(){
    4. int n,i,j,a[15][15],s=0;
    5. cin>>n;
    6. for(i=1;i<=n;i++){
    7. for(j=1;j<=n;j++)
    8. cin>>a[i][j];
    9. }
    10. for(i=1;i<n;i++){
    11. for(j=1;j<n;j++)
    12. if(i+j!=n+1)
    13. s+=a[i][j];
    14. }
    15. cout<<s;
    16. return 0;
    17. }

     7-2 方阵循环右移

    本题要求编写程序,将给定n×n方阵中的每个元素循环向右移m个位置,即将第0、1、⋯、n−1列变换为第n−m、n−m+1、⋯、n−1、0、1、⋯、n−m−1列。

    输入格式:

    输入第一行给出两个正整数m和n(1≤n≤6)。接下来一共n行,每行n个整数,表示一个n阶的方阵。

    输出格式:

    按照输入格式输出移动后的方阵:即输出n行,每行n个整数,每个整数后输出一个空格。

    输入样例:

    1. 2 3
    2. 1 2 3
    3. 4 5 6
    4. 7 8 9

    输出样例:

    1. 2 3 1
    2. 5 6 4
    3. 8 9 7
    1. #include<bits/stdc++.h>
    2. using namespace std;
    3. int main(){
    4. int m,n,i,j,a[10][10];
    5. cin>>m>>n;
    6. m=m%n;
    7. for(i=1;i<=n;i++){
    8. for(j=1;j<=n;j++)
    9. cin>>a[i][j];
    10. }
    11. for(i=1;i<=n;i++){
    12. for(j=n-m+1;j<=n;j++)
    13. cout<<a[i][j]<<' ';
    14. for(j=1;j<=n-m;j++)cout<<a[i][j]<<' ';
    15. cout<<endl;
    16. }
    17. return 0;
    18. }

    7-3 判断上三角矩阵

    上三角矩阵指主对角线以下的元素都为0的矩阵;主对角线为从矩阵的左上角至右下角的连线。

    本题要求编写程序,判断一个给定的方阵是否上三角矩阵。

    输入格式:

    输入第一行给出一个正整数T,为待测矩阵的个数。接下来给出T个矩阵的信息:每个矩阵信息的第一行给出一个不超过10的正整数n。随后n行,每行给出n个整数,其间以空格分隔。

    输出格式:

    每个矩阵的判断结果占一行。如果输入的矩阵是上三角矩阵,输出“YES”,否则输出“NO”。

    输入样例:

    1. 3
    2. 3
    3. 1 2 3
    4. 0 4 5
    5. 0 0 6
    6. 2
    7. 1 0
    8. -8 2
    9. 3
    10. 1 2 3
    11. 1 4 5
    12. 0 -1 6

    输出样例:

    1. YES
    2. NO
    3. NO
    1. #include<bits/stdc++.h>
    2. using namespace std;
    3. int main(){
    4. int t,n,i,j;
    5. cin>>t;
    6. while(t--){
    7. cin>>n;
    8. int a[15][15],x=0;
    9. for(i=1;i<=n;i++){
    10. for(j=1;j<=n;j++)
    11. {
    12. cin>>a[i][j];
    13. if(i>j&&a[i][j]!=0)x=1;
    14. }
    15. }
    16. if(x)cout<<"NO\n";
    17. else cout<<"YES\n";
    18. }
    19. return 0;
    20. }

     7-4 求矩阵各行元素之和

    本题要求编写程序,求一个给定的m×n矩阵各行元素之和。

    输入格式:

    输入第一行给出两个正整数m和n(1≤m,n≤6)。随后m行,每行给出n个整数,其间

    以空格分隔。

    输出格式:

    每行输出对应矩阵行元素之和。

    输入样例:

    1. 3 2
    2. 6 3
    3. 1 -8
    4. 3 12

    输出样例:

    1. 9
    2. -7
    3. 15
    1. #include<bits/stdc++.h>
    2. using namespace std;
    3. int main(){
    4. int m,n,i,j,a[10][10];
    5. cin>>m>>n;
    6. for(i=1;i<=m;i++){
    7. int s=0;
    8. for(j=1;j<=n;j++){
    9. cin>>a[i][j];
    10. s+=a[i][j];
    11. }
    12. cout<<s<<endl;
    13. }
    14. return 0;
    15. }

    7-5 找鞍点

    一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。

    本题要求编写程序,求一个给定的n阶方阵的鞍点。

    输入格式:

    输入第一行给出一个正整数n(1≤n≤6)。随后n行,每行给出n个整数,其间以空格分隔。

    输出格式:

    输出在一行中按照“行下标 列下标”(下标从0开始)的格式输出鞍点的位置。如果鞍点不存在,则输出“NONE”。题目保证给出的矩阵至多存在一个鞍点。

    输入样例1:

    1. 4
    2. 1 7 4 1
    3. 4 8 3 6
    4. 1 6 1 2
    5. 0 7 8 9

    输出样例1:

    2 1
    

    输入样例2:

    1. 2
    2. 1 7
    3. 4 1

    输出样例2:

    NONE
    1. #include<bits/stdc++.h>
    2. using namespace std;
    3. int main(){
    4. int n,i,j,k,a[10][10],y=0;
    5. cin>>n;
    6. for(i=0;i<n;i++){
    7. for(j=0;j<n;j++)
    8. cin>>a[i][j];
    9. }
    10. for(i=0;i<n;i++){
    11. int max=a[i][0];
    12. for(j=0;j<n;j++)
    13. {
    14. if(a[i][j]>=max){max=a[i][j];k=j;}
    15. }
    16. int min=max;
    17. for(int x=0;x<n;x++){
    18. if(a[x][k]<min){min=a[x][k];}
    19. }
    20. if(max==min){cout<<i<<' '<<k;y=1;break;}
    21. }
    22. if(y==0)cout<<"NONE";
    23. return 0;
    24. }

     7-6 求矩阵的局部极大值

    给定M行N列的整数矩阵A,如果A的非边界元素A[i][j]大于相邻的上下左右4个元素,那么就称元素A[i][j]是矩阵的局部极大值。本题要求给定矩阵的全部局部极大值及其所在的位置。

    输入格式:

    输入在第一行中给出矩阵A的行数M和列数N(3≤M,N≤20);最后M行,每行给出A在该行的N个元素的值。数字间以空格分隔。

    输出格式:

    每行按照“元素值 行号 列号”的格式输出一个局部极大值,其中行、列编号从1开始。要求按照行号递增输出;若同行有超过1个局部极大值,则该行按列号递增输出。若没有局部极大值,则输出“None 总行数 总列数”。

    输入样例1:

    1. 4 5
    2. 1 1 1 1 1
    3. 1 3 9 3 1
    4. 1 5 3 5 1
    5. 1 1 1 1 1

    输出样例1:

    1. 9 2 3
    2. 5 3 2
    3. 5 3 4

    输入样例2:

    1. 3 5
    2. 1 1 1 1 1
    3. 9 3 9 9 1
    4. 1 5 3 5 1

    输出样例2:

    None 3 5
    1. #include<bits/stdc++.h>
    2. using namespace std;
    3. int main(){
    4. int m,n,i,j,x=0,a[25][25];
    5. cin>>m>>n;
    6. for(i=1;i<=m;i++){
    7. for(j=1;j<=n;j++){
    8. cin>>a[i][j];
    9. }
    10. }
    11. for(i=2;i<m;i++){
    12. for(j=2;j<n;j++){
    13. if(a[i][j]>a[i-1][j]&&a[i][j]>a[i+1][j]&&a[i][j]>a[i][j-1]&&a[i][j]>a[i][j+1])
    14. {cout<<a[i][j]<<' '<<i<<' '<<j<<endl;x=1;}
    15. }
    16. }
    17. if(x==0)cout<<"None "<<m<<' '<<n;
    18. return 0;
    19. }

    7-7 打印杨辉三角

    本题要求按照规定格式打印前N行杨辉三角。

    输入格式:

    输入在一行中给出N(1≤N≤10)。

    输出格式:

    以正三角形的格式输出前N行杨辉三角。每个数字占固定4位。

    输入样例:

    6
    

    输出样例:

    1. 1
    2. 1 1
    3. 1 2 1
    4. 1 3 3 1
    5. 1 4 6 4 1
    6. 1 5 10 10 5 1
    1. #include<bits/stdc++.h>
    2. using namespace std;
    3. int main(){
    4. int n,i,j,a[15][15]={0};
    5. cin>>n;
    6. for(i=1;i<=n;i++){
    7. for(j=1;j<=n;j++){
    8. if(i==j||j==1)a[i][j]=1;
    9. else a[i][j]=a[i-1][j-1]+a[i-1][j];
    10. }
    11. }
    12. for(i=1;i<=n;i++){
    13. for(j=1;j<=n-i;j++)cout<<' ';
    14. for(j=1;j<=n;j++){
    15. if(a[i][j])printf("%4d",a[i][j]);
    16. }
    17. cout<<endl;
    18. }
    19. return 0;
    20. }

    7-8 螺旋方阵

    所谓“螺旋方阵”,是指对任意给定的N,将1到N×N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入N×N的方阵里。本题要求构造这样的螺旋方阵。

    输入格式:

    输入在一行中给出一个正整数N(<10)。

    输出格式:

    输出N×N的螺旋方阵。每行N个数字,每个数字占3位。

    输入样例:

    5
    

    输出样例:

    1. 1 2 3 4 5
    2. 16 17 18 19 6
    3. 15 24 25 20 7
    4. 14 23 22 21 8
    5. 13 12 11 10 9
    1. #include<bits/stdc++.h>
    2. using namespace std;
    3. int main(){
    4. int n,i=1,j=1,a[10][10]={0},k=1;
    5. cin>>n;
    6. int x=2*n-1,c=1,d=n;
    7. for(int y=1;y<=x;y++){
    8. if(y%4==1){
    9. for(j=c;j<=d;j++){
    10. if(a[c][j]==0)
    11. a[c][j]=k++;}
    12. j--;}
    13. if(y%4==2){
    14. for(i=c;i<=d;i++)
    15. {
    16. if(a[i][d]==0)
    17. a[i][d]=k++;}
    18. i--;}
    19. if(y%4==3){
    20. for(j=d;j>=c;j--)
    21. {
    22. if(a[d][j]==0)
    23. a[d][j]=k++;}
    24. j++;}
    25. if(y%4==0){
    26. for(i=d;i>=c;i--)
    27. {
    28. if(a[i][c]==0)
    29. a[i][c]=k++;}
    30. i++;c++;d--;}
    31. }
    32. for(i=1;i<=n;i++){
    33. for(j=1;j<=n;j++){
    34. printf("%3d",a[i][j]);
    35. }
    36. cout<<endl;
    37. }
    38. return 0;
    39. }

    7-9 简易连连看

    本题要求实现一个简易连连看游戏模拟程序。

    给定一个2N×2N的方阵网格游戏盘面,每个格子中放置一些符号。这些符号一定是成对出现的,同一个符号可能不止一对。程序读入玩家给出的一对位置(x1​,y1​)、(x2​,y2​),判断这两个位置上的符号是否匹配。如果匹配成功,则将两个符号消为“*”并输出消去后的盘面;否则输出“Uh-oh”。若匹配错误达到3次,则输出“Game Over”并结束游戏。或者当全部符号匹配成功,则输出“Congratulations!”,然后结束游戏。

    输入格式:

    输入在一行中给一个正整数N(<5)。随后2N行,每行2N个大写英文字母(其间以1个空格分隔),表示游戏盘面。盘面之后给出一个正整数K,随后K行,每行按照格式“x1​ y1​ x2​ y2​”给出一个玩家的输入。注意格子的行、列编号是从1到2N。

    输出格式:

    根据玩家的每一步输入,输出相应的结果。输出盘面时注意,每行字符间以1个空格分隔,行末不得有多余空格。

    输入样例1:

    1. 2
    2. I T I T
    3. Y T I A
    4. T A T Y
    5. I K K T
    6. 11
    7. 1 1 1 3
    8. 4 2 4 3
    9. 3 1 4 2
    10. 2 2 1 2
    11. 3 1 2 4
    12. 4 4 3 1
    13. 2 1 3 4
    14. 3 3 1 4
    15. 4 1 2 3
    16. 2 4 3 2
    17. 1 1 2 2

    输出样例1:

    1. * T * T
    2. Y T I A
    3. T A T Y
    4. I K K T
    5. * T * T
    6. Y T I A
    7. T A T Y
    8. I * * T
    9. Uh-oh
    10. * * * T
    11. Y * I A
    12. T A T Y
    13. I * * T
    14. Uh-oh
    15. * * * T
    16. Y * I A
    17. * A T Y
    18. I * * *
    19. * * * T
    20. * * I A
    21. * A T *
    22. I * * *
    23. * * * *
    24. * * I A
    25. * A * *
    26. I * * *
    27. * * * *
    28. * * * A
    29. * A * *
    30. * * * *
    31. Congratulations!

    输入样例2:

    1. 2
    2. I T I T
    3. Y T I A
    4. T A T Y
    5. I K K T
    6. 5
    7. 1 1 4 4
    8. 1 1 2 3
    9. 1 1 2 3
    10. 2 2 4 1
    11. 2 2 3 3

    输出样例2:

    1. Uh-oh
    2. * T I T
    3. Y T * A
    4. T A T Y
    5. I K K T
    6. Uh-oh
    7. Uh-oh
    8. Game Over
    1. #include<bits/stdc++.h>
    2. using namespace std;
    3. int main(){
    4. int n,i,j,k,x1,y1,x2,y2,s=0,m=0;char a[10][10];
    5. cin>>n;
    6. getchar();
    7. for(i=1;i<=2*n;i++){
    8. for(j=1;j<=2*n;j++)cin>>a[i][j];
    9. }
    10. cin>>k;
    11. while(k--){
    12. cin>>x1>>y1>>x2>>y2;
    13. if(a[x1][y1]==a[x2][y2]&&a[x1][y1]!='*'){
    14. m++;
    15. if(m==2*n*n){cout<<"Congratulations!";break;}
    16. a[x1][y1]=a[x2][y2]='*';
    17. for(i=1;i<=2*n;i++){
    18. for(j=1;j<=2*n;j++){
    19. if(j!=1)cout<<' ';
    20. cout<<a[i][j];
    21. }
    22. cout<<endl;
    23. }
    24. }
    25. else {
    26. cout<<"Uh-oh\n";
    27. s++;
    28. }
    29. if(s==3){cout<<"Game Over";break;}
    30. }
    31. return 0;
    32. }

     7-10 矩阵A乘以B

    给定两个矩阵A和B,要求你计算它们的乘积矩阵AB。需要注意的是,只有规模匹配的矩阵才可以相乘。即若A有Ra​行、Ca​列,B有Rb​行、Cb​列,则只有Ca​与Rb​相等时,两个矩阵才能相乘。

    输入格式:

    输入先后给出两个矩阵A和B。对于每个矩阵,首先在一行中给出其行数R和列数C,随后R行,每行给出C个整数,以1个空格分隔,且行首尾没有多余的空格。输入保证两个矩阵的R和C都是正数,并且所有整数的绝对值不超过100。

    输出格式:

    若输入的两个矩阵的规模是匹配的,则按照输入的格式输出乘积矩阵AB,否则输出Error: Ca != Rb,其中Ca是A的列数,Rb是B的行数。

    输入样例1:

    1. 2 3
    2. 1 2 3
    3. 4 5 6
    4. 3 4
    5. 7 8 9 0
    6. -1 -2 -3 -4
    7. 5 6 7 8

    输出样例1:

    1. 2 4
    2. 20 22 24 16
    3. 53 58 63 28

    输入样例2:

    1. 3 2
    2. 38 26
    3. 43 -5
    4. 0 17
    5. 3 2
    6. -11 57
    7. 99 68
    8. 81 72

    输出样例2:

    Error: 2 != 3

    1. #include<bits/stdc++.h>
    2. using namespace std;
    3. int main(){
    4. int a,b,c,d,i,j,x[105][105],y[105][105];
    5. cin>>a>>b;
    6. for(i=0;i<a;i++){
    7. for(j=0;j<b;j++)
    8. cin>>x[i][j];
    9. }
    10. cin>>c>>d;
    11. for(i=0;i<c;i++){
    12. for(j=0;j<d;j++)
    13. cin>>y[i][j];
    14. }
    15. if(b!=c)cout<<"Error: "<<b<<" != "<<c;
    16. else {
    17. cout<<a<<' '<<d<<endl;
    18. for(i=0;i<a;i++){
    19. for(j=0;j<d;j++){
    20. int s=0;
    21. if(j)cout<<' ';
    22. for(int k=0;k<b;k++)
    23. s+=x[i][k]*y[k][j];
    24. cout<<s;
    25. }
    26. cout<<endl;
    27. }
    28. }
    29. return 0;
    30. }

    7-11 矩阵转置

    从键盘输入一个m(2<=m<=6)*n(2<=n<=6)阶的矩阵,编程输出它的转置矩阵。

    输入格式:

    在第一行输入矩阵的行数m和列数n的值,在第二行按照矩阵格式输入矩阵的数据,同行数据之间用空格隔开。

    输出格式:

    矩阵格式输出,同行数据之间用一个空格隔开。

    输入样例:

    1. 3 5
    2. 1 2 3 4 5
    3. 1 2 3 4 5
    4. 1 2 3 4 5

    输出样例:

    1. 1 1 1
    2. 2 2 2
    3. 3 3 3
    4. 4 4 4
    5. 5 5 5
    1. #include<bits/stdc++.h>
    2. using namespace std;
    3. int main(){
    4. int m,n,i,j,a[10][10];
    5. cin>>m>>n;
    6. for(i=1;i<=m;i++){
    7. for(j=1;j<=n;j++)
    8. cin>>a[i][j];
    9. }
    10. for(j=1;j<=n;j++){
    11. for(i=1;i<=m;i++){
    12. if(i!=1)cout<<' ';
    13. cout<<a[i][j];
    14. }
    15. cout<<endl;
    16. }
    17. return 0;
    18. }

     7-12 刮刮彩票

    “刮刮彩票”是一款网络游戏里面的一个小游戏。如图所示:

    -362960_55cb6a89bf693.png

    每次游戏玩家会拿到一张彩票,上面会有 9 个数字,分别为数字 1 到数字 9,数字各不重复,并以 3×3 的“九宫格”形式排布在彩票上。

    在游戏开始时能看见一个位置上的数字,其他位置上的数字均不可见。你可以选择三个位置的数字刮开,这样玩家就能看见四个位置上的数字了。最后玩家再从 3 横、3 竖、2 斜共 8 个方向中挑选一个方向,方向上三个数字的和可根据下列表格进行兑奖,获得对应数额的金币。

    数字合计获得金币数字合计获得金币
    610,0001672
    73617180
    872018119
    93601936
    108020306
    11252211,080
    1210822144
    1372231,800
    1454243,600
    15180

    现在请你写出一个模拟程序,模拟玩家的游戏过程。

    输入格式:

    输入第一部分给出一张合法的彩票,即用 3 行 3 列给出 0 至 9 的数字。0 表示的是这个位置上的数字初始时就能看见了,而不是彩票上的数字为 0。

    第二部给出玩家刮开的三个位置,分为三行,每行按格式 x y 给出玩家刮开的位置的行号和列号(题目中定义左上角的位置为第 1 行、第 1 列。)。数据保证玩家不会重复刮开已刮开的数字。

    最后一部分给出玩家选择的方向,即一个整数: 1 至 3 表示选择横向的第一行、第二行、第三行,4 至 6 表示纵向的第一列、第二列、第三列,7、8分别表示左上到右下的主对角线和右上到左下的副对角线。

    输出格式:

    对于每一个刮开的操作,在一行中输出玩家能看到的数字。最后对于选择的方向,在一行中输出玩家获得的金币数量。

    输入样例:

    1. 1 2 3
    2. 4 5 6
    3. 7 8 0
    4. 1 1
    5. 2 2
    6. 2 3
    7. 7

    输出样例:

    1. 1
    2. 5
    3. 6
    4. 180
    1. #include<bits/stdc++.h>
    2. using namespace std;
    3. int main(){
    4. int i,j,a[5][5],x,y,z,s=0,c[10]={0},d;
    5. int b[30]={0,0,0,0,0,0,10000,36,720,360,80,252,108,72,54,180,72,180,119,36,306,1080,144,1800,3600};
    6. for(i=1;i<=3;i++){
    7. for(j=1;j<=3;j++)
    8. {
    9. cin>>a[i][j];c[a[i][j]]=1;
    10. }
    11. }
    12. for(i=1;i<=9;i++)
    13. if(c[i]==0) d=i;
    14. for(i=1;i<=3;i++){
    15. for(j=1;j<=3;j++)
    16. {
    17. if(a[i][j]==0){
    18. a[i][j]=d;
    19. }
    20. }
    21. }
    22. for(i=1;i<=3;i++){
    23. cin>>x>>y;
    24. cout<<a[x][y]<<endl;
    25. }
    26. cin>>z;
    27. if(z==1)for(j=1;j<=3;j++)s+=a[1][j];
    28. if(z==2)for(j=1;j<=3;j++)s+=a[2][j];
    29. if(z==3)for(j=1;j<=3;j++)s+=a[3][j];
    30. if(z==4)for(j=1;j<=3;j++)s+=a[j][1];
    31. if(z==5)for(j=1;j<=3;j++)s+=a[j][2];
    32. if(z==6)for(j=1;j<=3;j++)s+=a[j][3];
    33. if(z==7)for(j=1;j<=3;j++)s+=a[j][j];
    34. if(z==8) s+=a[1][3]+a[2][2]+a[3][1];
    35. cout<<b[s];
    36. return 0;
    37. }

     7-13  数雷

    扫雷游戏玩过吗?没玩过的请参考下图。

    2081.png

    点开一个格子的时候,如果这一格没有雷,那它上面显示的数字就是周围8个格子(忽略游戏区域外的格子)的地雷数目。给你一个矩形区域表示的雷区,请数一数各个无雷格子周围(上,下,左,右,左上,右上,左下,右下等8个方向)有几个雷。

    输入格式:

    首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。对于每组测试,第一行输入2个整数x,y(1≤ x,y ≤15),接下来输入x行每行y个字符,用于表示地雷的分布,其中,*表示地雷,.表示该处无雷。

    输出格式:

    对于每组测试,输出一个x行y列的矩形,其中有地雷的格子显示*,没地雷的格子显示其周围8个格子中的地雷总数。任意两组测试之间留一个空行。

    输入样例:

    1. 2
    2. 3 3
    3. **.
    4. ..*
    5. .*.
    6. 2 4
    7. *..*
    8. *...

    输出样例:

    1. **2
    2. 34*
    3. 1*2
    4. *21*
    5. *211

    1. #include<bits/stdc++.h>
    2. using namespace std;
    3. int main(){
    4. int t;
    5. cin>>t;
    6. while(t--){
    7. int x,y,i,j;
    8. char a[20][20]={' '};
    9. cin>>x>>y;
    10. for(i=1;i<=x;i++){
    11. for(j=1;j<=y;j++)
    12. cin>>a[i][j];
    13. }
    14. for(i=1;i<=x;i++){
    15. for(j=1;j<=y;j++)
    16. {
    17. int s=0;
    18. if(a[i][j]=='.'){
    19. if(a[i-1][j]=='*')s++;
    20. if(a[i][j-1]=='*')s++;
    21. if(a[i+1][j]=='*')s++;
    22. if(a[i][j+1]=='*')s++;
    23. if(a[i-1][j-1]=='*')s++;
    24. if(a[i+1][j+1]=='*')s++;
    25. if(a[i-1][j+1]=='*')s++;
    26. if(a[i+1][j-1]=='*')s++;
    27. cout<<s;
    28. }
    29. else cout<<a[i][j];
    30. }
    31. cout<<endl;
    32. }
    33. if(t!=0)
    34. cout<<endl;
    35. }
    36. return 0;
    37. }

    7-14 最矮的巨人

    操场上有N x N个“巨人”按N行N列的矩阵形式列队,请编程找出该方阵中所有“最矮的巨人”。
    所谓“最矮的巨人”是指,该巨人在其所在行中,身高最高(没人比其更高);且在其所在列中,身高最矮(没人比其更矮)。

    输入格式:

    输入的第1行给出一个正整数n ( 1 ≤ n ≤ 6 ),表示方阵的行列数。随后n行,每行给出n个整数,代表巨人的身高,其间以空格作分隔。

    输出格式:

    如果找到至少一个“最矮巨人”,输出如下:

    (第1个最矮巨人所在行下标,第1个最矮巨人所在列下标)

    (第2个最矮巨人所在行下标,第2个最矮巨人所在列下标)

    ...

    (第n个最矮巨人所在行下标,第n个最矮巨人所在列下标)

    如果没有找到“最矮巨人”,输出如下:
    NONE

    注意:即便输出结果只有一行,也要输出换行符。行列下标均从0开始计数。

    输入样例:

    1. 4
    2. 1 7 4 6
    3. 4 6 3 6
    4. 1 6 1 6
    5. 0 7 8 7

    输出样例:

    1. (1,1)
    2. (1,3)
    3. (2,1)
    4. (2,3)
    1. #include<bits/stdc++.h>
    2. using namespace std;
    3. int main(){
    4. int n,i,j,k,a[10][10],y=0;
    5. cin>>n;
    6. for(i=0;i<n;i++){
    7. for(j=0;j<n;j++)
    8. cin>>a[i][j];
    9. }
    10. for(i=0;i<n;i++){
    11. int max=a[i][0];
    12. for(j=0;j<n;j++)
    13. {
    14. if(a[i][j]>=max)
    15. max=a[i][j];
    16. }
    17. for(j=0;j<n;j++){
    18. if(a[i][j]==max){
    19. k=j;
    20. int min=max;
    21. for(int x=0;x<n;x++){
    22. if(a[x][k]<=min){min=a[x][k];}
    23. }
    24. if(max==min){cout<<"("<<i<<','<<k<<")"<<endl;y=1;}
    25. }
    26. }
    27. }
    28. if(y==0)cout<<"NONE";
    29. return 0;
    30. }

    7-15 机工士姆斯塔迪奥 

    在 MMORPG《最终幻想14》的副本“乐欲之所瓯博讷修道院”里,BOSS 机工士姆斯塔迪奥将会接受玩家的挑战。

    你需要处理这个副本其中的一个机制:N×M 大小的地图被拆分为了 N×M 个 1×1 的格子,BOSS 会选择若干行或/及若干列释放技能,玩家不能站在释放技能的方格上,否则就会被击中而失败。

    给定 BOSS 所有释放技能的行或列信息,请你计算出最后有多少个格子是安全的。

    输入格式:

    输入第一行是三个整数 N,M,Q (1≤N×M≤105,0≤Q≤1000),表示地图为 N 行 M 列大小以及选择的行/列数量。

    接下来 Q 行,每行两个数 Ti​,Ci​,其中 Ti​=0 表示 BOSS 选择的是一整行,Ti​=1 表示选择的是一整列,Ci​ 为选择的行号/列号。行和列的编号均从 1 开始。

    输出格式:

    输出一个数,表示安全格子的数量。

    输入样例:

    1. 5 5 3
    2. 0 2
    3. 0 4
    4. 1 3

    输出样例:

    12
    1. #include<bits/stdc++.h>
    2. using namespace std;
    3. int main(){
    4. int n,m,q,x,y,i,j;
    5. cin>>n>>m>>q;
    6. int a[n+5][m+5],b=0;
    7. for(i=1;i<=n;i++){
    8. for(j=1;j<=m;j++)
    9. a[i][j]=0;
    10. }
    11. while(q--){
    12. cin>>x>>y;
    13. if(x==0){
    14. for(j=1;j<=m;j++)
    15. a[y][j]=1;
    16. }
    17. else {
    18. for(i=1;i<=n;i++)
    19. a[i][y]=1;
    20. }
    21. }
    22. for(i=1;i<=n;i++){
    23. for(j=1;j<=m;j++)
    24. if(a[i][j]==0)b++;
    25. }cout<<b;
    26. return 0;
    27. }

    1. #include<bits/stdc++.h>
    2. using namespace std;
    3. int main(){
    4. int n,m,q,i,j,x,y,s1=0,s2=0;
    5. map<int,int>b[2];b[2][100005]={0};
    6. cin>>n>>m>>q;
    7. while(q--){
    8. cin>>x>>y;
    9. if(b[x][y]==0){
    10. if(x==0)s1++;
    11. else s2++;
    12. b[x][y]=1;}
    13. }cout<<n*m-(s1*m+s2*n-s1*s2);
    14. return 0;
    15. }

  • 相关阅读:
    java计算机毕业设计校园共享单车管理系统源码+系统+数据库+lw文档+mybatis+运行部署
    STL:stack和queue
    从普通进阶成优秀的测试/开发程序员,一路过关斩将
    安装Python
    Kaggle房价预测问题
    链表中LinkList L与LinkList *L( & * L.elem L->elem)
    Spring 加强版 ORM 框架 spring-data-jpa 入门与实践
    学习方法揣摩--不断的往此篇文章填一些一时看到听到的只言片语--能分类就整个目录,不能就放在最下面
    MySQL8窗口函数应用
    Torch生成类激活图CAM
  • 原文地址:https://blog.csdn.net/m0_51863774/article/details/134396422