有关二维数组的PAT题目

本文介绍了PAT编程题目,涉及二维数组的鞍点寻找和螺旋矩阵的构造。鞍点是指矩阵中某元素在同一行中最大且在同一列中最小,程序需要找到这样的位置。而螺旋矩阵则是按照顺时针方向填充数字的方阵。文章提供了输入输出格式和样例,旨在帮助读者理解和解决这类问题。
摘要由CSDN通过智能技术生成
5-8 找鞍点   (20分)

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

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

输入格式:

输入第一行给出一个正整数nn1\le n\le 61n6)。随后nn行,每行给出nn个整数,其间以空格分隔。

输出格式:

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

输入样例1:

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

输出样例1:

2 1

输入样例2:

2
1 7
4 1

输出样例2:

NONE


代码1:
#include<stdio.h>
int main(){
int n;
scanf("%d",&n);

int num[7][7]={0};
int max[6]={0};
int min[6]={9,9,9,9,9,9};
int pos[6]={0};
int i,j;
for(i=0;i<7;i++){
for(j=0;j<7;j++){

num[i][j]=0;
}
}

for(i=0;i<n;i++){
for(j=0;j<n;j++){
scanf("%d",&num[i][j]);
}
}


for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(num[i][j]>max[i]){
max[i]=num[i][j];

}
}



}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(num[j][i]<min[i]){
min[i]=num[j][i];
}}}


int flag=0;
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if((num[i][j]==max[i])&&(num[i][j]==min[j])){
printf("%d %d",i,j);
flag=1;
break;
}
}
if(flag==1){
break;
}
}
if(!flag){
printf("NONE");
}

return 0;
}
代码
2:
#include<stdio.h>
int main(){
       int matrix[8][8];
       int i,j,k,n,f;
       int min,max;
       for (i=0;i<8;i++)
              for (j=0;j<8;j++)
                    matrix[i][j]=0;
              
       scanf("%d",&n);     
       for (i=0;i<n;i++)
              for (j=0;j<n;j++)
                    scanf("%d",&matrix[i][j]);
       for (i=0;i<n;i++)
              for (j=0;j<n;j++)
                    if (matrix[i][n] <   matrix[i][j])
                                  matrix[i][n] =       matrix[i][j];
       for (j=0;j<n;j++){
              matrix[n][j] = matrix[0][j];
              for (i=0;i<n;i++)
                    if (matrix[n][j] >   matrix[i][j])
                                  matrix[n][j] =       matrix[i][j]; 
       }
       f=0;
       for (i=0;i<n;i++){
 
                    for (j=0;j<n;j++){
              
                           if (matrix[i][j] == matrix[n][j] && matrix[i][j] == matrix[i][n]){
                                  f=1;
                                  break;
                           }
                    }
                           if (f ==1)break;
                    }                                 
       if (f ==1){
              printf("%d %d",i,j);
       }else{
              printf("NONE");
       }
       return 0;
}

5-7

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

输入格式:

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

输出格式:

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

输入样例:

5

输出样例:

  1  2  3  4  5
 16 17 18 19  6
 15 24 25 20  7
 14 23 22 21  8
 13 12 11 10  9
代码:
#include<stdio.h>
  #include<string.h>
 int main()
 {
     int N,a[20][20]={0},i=1,j=1,k=1;
    
     scanf("%d",&N);
    while(k<=N*N)
     {
         while(j<=N)
         {
             if(!a[i][j])
                 a[i][j++]=k++;
             else
                 break;
         }
         j--;
        i++;
         while(i<=N)
         {
             if(!a[i][j])
                 a[i++][j]=k++;
             else
                 break;
         }
         i--;
         j--;
         while(j>0)
         {
             if(!a[i][j])
                 a[i][j--]=k++;
             else
                 break;
         }
         j++;
         i--;
         while(i>0)
         {
             if(!a[i][j])
                 a[i--][j]=k++;
             else
                 break;
         }
         i++;
         j++;
     }
     for(i=1;i<=N;i++)
     {
         for(j=1;j<N;j++)
             printf("%3d",a[i][j]);
        printf("%3d\n",a[i][j]);
     }
     return 0;
}
5-6 求矩阵的局部极大值   (15分)

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

输入格式:

输入在第一行中给出矩阵AA的行数MM和列数NN3\le M, N\le 203M,N20);最后MM行,每行给出AA在该行的NN个元素的值。数字间以空格分隔。

输出格式:

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

输入样例1:

4 5
1 1 1 1 1
1 3 9 3 1
1 5 3 5 1
1 1 1 1 1

输出样例1:

9 2 3
5 3 2
5 3 4

输入样例2:

3 5
1 1 1 1 1
9 3 9 9 1
1 5 3 5 1

输出样例2:

None 3 5
#include<stdio.h>
int main(){
int m,n;
scanf("%d %d",&m,&n);
int num[m][n];
int i,j;
for(i=0;i<m;i++){
for(j=0;j<n;j++){
scanf("%d",&num[i][j]);
}

}
int cou=0;
for(i=1;i<m-1;i++){
for(j=1;j<n-1;j++){
if((num[i][j]>num[i][j-1])&&(num[i][j]>num[i][j+1])&&(num[i][j]>num[i-1][j]&&num[i][j]>num[i+1][j])){
printf("%d %d %d\n",num[i][j],i+1,j+1);
cou++;
}
}

}
if(cou==0){
printf("None %d %d",m,n);
}
return 0;
}




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值