將一個5x5的矩陣中最大的元素放在中心,4個角分別放4個最小的元素(順序為從左到右,從上到下依次從小到大存放),寫一函數實現之。用main函數調用。
解題思路: 將二維數組當做一維數組進行處理比較方便,而二維數組本身就是扁平化存儲,所以直接使用首地址即可。
先遍歷找到最大值,將其與中間數字交換,而中間數字的下標就是數字總數除以2;
其次尋找四次最小值,每次尋找的時候將最小值的下標記錄起來,前提是這個數字如果已經是選中的最小數字之一,則需要跳過,也就是只跟剩余的數字作比較。(第二次開始遍歷找最小數字的時候,千萬不能與第一個最小數進行比較,否則永遠都只有一個最小數)。
答案:
#include <stdio.h>
#include <string.h>
void transform(int *arry, int col_row)
{
//找到最大值
int max = arry[0], max_idx;
for (int i = 0; i < col_row * col_row; i++) {
if (max < arry[i]) max = arry[i];//找出最大數
max_idx = i;
}
//行列相乘得到總數量,除以2后加1則為中心點(暫時不考慮偶數的情況)
int center_idx = (col_row * col_row) / 2;
int tmp = arry[cen ter_idx]; arry[center_idx] = arry[max_idx]; arry[max_idx] = tmp;
//找到四個最小值
int min_idx[4];
for (int i = 0; i < 4; i++) {//循環4次獲取到最小值
int min_tmp = arry[col_row * col_row - 1];
for (int j = 0; j < col_row * col_row; j++) {//遍歷所有數據,逐個比較獲取最小值
int k = 0;
for (; k < i; k++) {//但是要注意如果某個下標的數據已經是獲取過的最小值,則不能進行判斷(因為這個肯定是最小的)
if (j == min_idx[k]) break;
}
if (k != i) { continue; }//k和i不同表示j這個坐標已經是找到的最小的幾個數字之一,則找下一個判斷
if (min_tmp > arry[j]) { // 相當於在剩下的數中找到最小的那個數字
min_tmp = arry[j];
min_idx[i] = j; //並且記錄這個數字的位置
}
}
}
int change_idx[4];//先計算四個角的下標,便於后邊進行交換
change_idx[0] = 0;//第一個要置換的數據的下標,也就是左上角
change_idx[1] = col_row - 1;//第二個要置換的數據的下標,也就是右上角
change_idx[2] = col_row * (col_row - 1);//第一個要置換的數據的下標,也就是左下角
change_idx[3] = (col_row * col_row) - 1;//第一個要置換的數據的下標,也就是右下角
for (int i = 0; i < 4; i++) {
int tmp = arry[change_idx[i]]; arry[change_idx[i]] = arry[min_idx[i]]; arry[min_idx[i]] = tmp;
}
return ;
}
int main()
{
int arry[5][5];
printf("Please enter a 5x5 matrix: \n");
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
scanf_s("%d", &arry[i][j]);
}
}
transform(*arry, 5);//將二維數組當做一維數組傳入處理,並且傳入行列數
printf("\n");
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
printf("%d ", arry[i][j]);
}
printf("\n");
}
system("pause");
return 0;
}