xdoj数组题目3

数组平移

 
题目描述:
已知数组array[10]={1,2,3,4,5,6,7,8,9,10};要求把下标从0到p(p从键盘输入)的数组元素平移到数组的最后,并输出平移后的数组。

输入格式:输入一个整数p;
输出格式:共一行,输出平移后的数组,数字之间用空格分隔

示例:
输入:3
输出:5 6 7 8 9 10 1 2 3 4

#include <stdio.h>    
int main()
{
    //初始化 
    int array[10]={1,2,3,4,5,6,7,8,9,10};
    int p=0,i=0,r=1;
    scanf("%d",&p);
    int a[10]={0};
    int b[10]={0};
    
    //平移
    for(i=0;i<9-p;i++)
    {
        array[i]=p+i+2;
    } 
    for(i=9-p;i<10;i++)
    {
        array[i]=r;
        r++;
    }
    
    
    //输出
    for(i=0;i<10;i++)
    {
        printf("%d ",array[i]);
     } 
    
    return 0;

   
矩阵


问题描述    
请写一个程序,对于一个m行m列(2<m<20)的方阵,求其每一行、每一列及主、辅对角线元素之和,然后按照从大到小的顺序依次输出这些值。
注:主对角线是方阵从左上角到右下角的一条斜线,辅对角线是方阵从右上角到左下角的一条斜线。
输入说明    
输入数据的第一行为一个正整数m;
接下来为m行、每行m个整数表示方阵的元素。
输出说明    
从大到小排列的一行整数,每个整数后跟一个空格,最后换行。
输入样例    
4
15  8   -2   6
31  24  18  71
-3  -9   27  13
17  21  38  69
输出样例    
159 145 144 135 81 60 44 32 28 27

#include <stdio.h>    
void bubble(int arr[],int x)
{
    int i=0,j=0;
    for(i=0;i<x-1;i++)
    {
        for(j=0;j<x-i-1;j++)
        {
            if(arr[j]<arr[j+1])
            {
                int t=arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=t;
            }
        }
    }
    
}
int main()
{
    //初始化 
    int m=0,i=0,j=0,sum=0,k=0,h1=0,h2=0;
    scanf("%d",&m);
    int num[20][20]={0};
    int plus[50]={0};
    for(i=0;i<m;i++)
    {
        for(j=0;j<m;j++)
        {
            scanf("%d",&num[i][j]);
        }
    }
    
    //计算
    for(i=0;i<m;i++)
    {
        for(j=0;j<m;j++)
        {
            sum=sum+num[i][j];
        }
        plus[i]=sum;
        sum=0;
    }
    for(j=0,k=m;j<m;j++)
    {
        for(i=0;i<m;i++)
        {
            sum=sum+num[i][j];
        }
        plus[k]=sum;
        k++;
        sum=0;
    }
    for(i=0,sum=0;i<m;i++)
    {
        for(j=0;j<m;j++)
        {
            if(i==j)
            sum=sum+num[i][j];
        }
    }
    h1=sum;
    for(j=m-1,sum=0;j>=0;j--)
    {
        for(i=0;i<m;i++)
        {
            if(i+j==m-1)
            sum=sum+num[i][j];
        }
    }
    h2=sum;
    plus[2*m]=h1;
    plus[2*m+1]=h2;
    bubble(plus,2*m+2);
    
    //输出 
    for(i=0;i<=2*m+1;i++)
    {
        printf("%d ",plus[i]);
    }
        
    return 0;
}

       
回文数


问题描述    
若一个非负整数其各位数字按照正反顺序读完全相同,则称之为回文数,例如12321。
判断输入的整数是否是回文数。若是,则输出该整数各位数字之和,否则输出no。

输入说明    
输入为一个整数n,0<=n<1000000000。
输出说明    
若该整数为回文数,则输出整数各位数字之和,否则输出no。
输入样例    
样例1输入
131
样例2输入
24
输出样例
样例1输出    
5
样例2输出
no

#include <stdio.h>
int main()
{
    //初始化 
    int m=0,i=0,d=1,n=0,k1=0,k2=0,k=1,sum=0;
    scanf("%d",&m);
    n=m;
    
    //判断位数从而存储,进而计算 
    for(;m>10;)
    {
        m/=10;
        d++;
    } 
    int digit[d]={0};
    int Digit[d]={0};
    for(i=0;i<d;i++)
    {
        digit[i]=n%10;
        n/=10;
    }
    for(i=0;i<d;i++)
    {
        Digit[i]=digit[d-i-1];
    }
    for(i=0;i<d;i++)
    {
        
        k1=k1+k*digit[i];
        k2=k2+k*Digit[i];
        k*=10;
    }
    
    //判断输出
    if(k1==k2)
    {
        for(i=0;i<d;i++)
        {
            sum=digit[i]+sum;
        }
        printf("%d",sum);
    } 
    else 
    {
        printf("no");
    }
    
    return 0;

  数组鞍点


输入一个4行5列的二维数组,求出数组中鞍点及其所在行与列
(鞍点:即该位置上的元素在该行中最大,在该列中最小)

输入格式:输入一个4行5列的整形数组

输出格式:如果鞍点存在,分别输出鞍点的元素值,所在行和所在列,用空格分隔;
          如果鞍点不存在,输出“鞍点不存在”。

输入样例一:  1 2 3 4 5
             6 7 8 9 10
             1 3 5 7 9
             2 4 6 8 10

输出样例一:5 1 5

输入样例二:5 4 3 2 1
            1 2 3 4 5
            1 3 5 7 9
            2 4 6 8 10

输出样例二:鞍点不存在

#include <stdio.h>
int main()
{
    //初始化 
    int num[4][5]={0};
    int i=0,j=0,flag=0; 
    int max[4],min[5];
    for(i=0;i<4;i++)
    {
        for(j=0;j<5;j++)
        {
            scanf("%d",&num[i][j]);
        }
    }
    //寻找鞍点
    for(i=0;i<4;i++)
    {
        max[i]=num[i][0];
        for(j=0;j<5;j++)
        {
            if(num[i][j]>max[i])
            max[i]=num[i][j];
        }
    }
    for(j=0;j<5;j++)
    {
        min[j]=num[0][j];
        for(i=0;i<4;i++)
        {
            if(num[i][j]<min[j])
            min[j]=num[i][j];
        }
    }
    for(i=0;i<4;i++)
    {
        for(j=0;j<5;j++)
        {
            if(max[i]==num[i][j]&&min[j]==num[i][j])
            {
                printf("%d %d %d\n",num[i][j],i+1,j+1);
                flag=1;
            }
        }
    }
    if(flag==0)
    printf("鞍点不存在");
    
    return 0;

        
相邻区域


问题描述    
一个n行m列的矩阵被划分成t个矩形区域,分别用数字1-t来标识,同一个区域内的元素都用同一个数字标识。如下图所示,一个6行8列的矩阵被分成8个矩形区域,分别用编号1-8标识。
当两个小区域之间公用一条边时,称这两个区域相邻,例如下图中区域5的相邻区域有6个,分别为1,2,3,6,7,8,但4并不是它的相邻区域。请写一个程序找出区域k的所有相邻区域。
输入说明    
输入第一行为四个整数n,m, t,k,整数之间用空格分隔。n表示矩阵行数(n<20),m表示矩阵列数(m<20),t表示矩阵被划分为t个矩形区域(0<t<50),k为其中某个区域的编号(1<=k<=t)。
接下来是n行数据,每行m个整数,表示矩阵内各个元素所在的区域,整数之间用空格分隔。

输出说明    
输出为一个整数,表示与k相邻的区域个数

输入样例    
6  8  8  5
1    1    2    2    2    3    3    4
1    1    2    2    2    3    3    4
1    1    2    2    2    3    3    4
1    1    5    5    5    5    5    6
1    1    5    5    5    5    5    6
7    7    7    7    7    8    8    8

输出样例    
6


#include <stdio.h>
void Find(int num[21][21],int *area,int i,int j)//这里area数组的形参使用的是指针,这样可以更改其中数据,而num只是传过来一个数组,并不会改变其中数据 
{
    if(i!=0 && num[i-1][j]>0 && num[i-1][j]!=num[i][j])//向上方搜索,这里向上向左搜索时是-1所以需要判断此时i,j>0 
    {
        area[num[i-1][j]]++; 
    }
    if(j!=0 && num[i][j-1]>0 && num[i][j-1]!=num[i][j])//向左搜索 
    {
        area[num[i][j-1]]++;
    }
    if(num[i+1][j]>0 && num[i+1][j]!=num[i][j])//向下搜搜 
    {
        area[num[i+1][j]]++; 
    }
    if(num[i][j+1]>0 && num[i][j+1]!=num[i][j])//向右搜索
    {
        area[num[i][j+1]]++;
    }//注意搜索的时候我们多了一个k的情况,最后要减去 
}

int main()
{
    //初始化 
    int n,m,t,k;
    int i=0,j=0,cal=0;
    scanf("%d%d%d%d",&n,&m,&t,&k);
    int num[21][21]={0};
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
        {
            scanf("%d",&num[i][j]);
        }
    }
    
    //寻找,先找到这个区域开始和结束的位置
    int x1=0,y1=0,x2=0,y2=0,sign=0;
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
        {
            if(num[i][j]==k && sign==0)
            {
                x1=i;
                y1=j;
                sign=1;//只找到一次就可以 
            }
            if(num[i][j]==k && num[i+1][j]!=k && num[i][j+1]!=k)//如果这个数右边和下边都不是k那么就是到头了
            {
                x2=i;
                y2=j;
            }     
        }
    }
    //找到开始和结束的位置之后开始在这个区域旁边查找有几个相邻区域
    int area[50]={0};
    for(i=x1;i<=x2;i++)
    {
        for(j=y1;j<=y2;j++)
        {
            Find(num,area,i,j);
        }
    } 
    
    for(i=0;i<50;i++)
    {
        if(area[i]!=0 && i!=k)
        cal++;
    }
    printf("%d",cal);
    
    return 0;

  • 9
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北の风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值