題目
給出任意一個(gè)N*N的矩陣撮胧,將里面的數(shù)字按照從左上到右下有小到大排序,之后計(jì)算出新矩陣對(duì)角線上的數(shù)字總和(每個(gè)位置只參與一次計(jì)算)芹啥。例如:
給出左邊這個(gè)矩陣,先把它轉(zhuǎn)換成右邊的矩陣墓怀,之后計(jì)算對(duì)角線上的數(shù)字之和:1 + 5 + 9 + 3 + 7 = 25
解題思路
首先,獲取N傀履,然后用一維數(shù)組獲取數(shù)據(jù)虱朵,并進(jìn)行排序钓账。因?yàn)楹竺嬉玫接?jì)算,所以需要轉(zhuǎn)化成二位數(shù)組梆暮,關(guān)系為arr1[i][j]=arr[num*i+j]
其次,找到計(jì)算的規(guī)律啦粹,即i=j和(a+b+1)==num)&&(a!=b)偿荷,最后輸出跳纳。定義兩個(gè)函數(shù)sort()用來(lái)排序,count()用來(lái)計(jì)算泪蔫。
源代碼
#include <stdio.h>
#define MAX 10001
int num;
int sum=0;
int arr[MAX];
int arr1[MAX][MAX];
void sort()
{
int i,j;
for(i=0;i<num*num;i++)
{
for(j=0;j<num*num-i-1;j++)
{
if(arr[j]>arr[j+1])
{
arr[j]+=arr[j+1];
arr[j+1]=arr[j]-arr[j+1];
arr[j]=arr[j]-arr[j+1];
}
}
}
}
void count()
{
for(int a=0;a<num;a++)
{
for(int b=0;b<num;b++)
{
if(a==b)
{
sum+=arr1[a][b];
}
else if(((a+b+1)==num)&&(a!=b))
{
sum+=arr1[a][b];
}
}
}
}
void main()
{
int i,j;
scanf("%d",&num);
for(i=0;i<num*num;i++)
{
scanf("%d",&arr[i]);
}
sort();
printf("\n");
for(i=0;i<num;i++)
{
for(j=0;j<num;j++)
{
printf("%d ",arr[num*i+j]);
arr1[i][j]=arr[num*i+j];
}
printf("\n");
}
count();
printf("%d\n",sum);
}
執(zhí)行結(jié)果
Paste_Image.png
總結(jié)
主要注意一維數(shù)組和二維數(shù)組的轉(zhuǎn)換撩荣,排序算法的寫(xiě)法和計(jì)算的規(guī)律铣揉。