problem: 給定一個二維數組,找兩個數使其和為最大的,要求這兩個數不同行不同列。 solution: 把二維數組轉換為一維數組,那麼一維數組的長度為N = ROW * COL, 假設二維數組 a[2][3] = { {1, 3, 1}, {2, 4, 5} }; 那麼其二維數組為 b[6] = { 1, 3, 1, 2, 4, 5 }; 那麼存在這樣的關系 b[ i ] = a[i / COL][i % COL], 此時ROW = 2, COL = 3; 比如 b[2] = a[2/3][2%3] = a[0][2] = 1;有了這層關系,就可以做了. 對一維數組的b[i](i = 0,1,2…… ,N - 1)開始,分別與b[0] - b[N - 1]相加,判斷是否滿足“不同行不同列”的條件,滿足就把maxVal求出來,與之前的maxVal做比較,把較大的給maxVal,直到比較結束, 如此就可以求出最大值了,時間復雜度為O(N2);
/*
problem: 給定一個二維數組,找兩個數使其和為最大的,要求這兩個數不同行不同列。
solution:把二維數組轉換為一維數組,那麼一維數組的長度為N = ROW * COL,
假設二維數組a[2][3] = { {1, 3, 1}, {2, 4, 5} };那麼其二維數組為b[6] = { 1, 3, 1, 2, 4, 5 };
那麼存在這樣的關系b[i] = a[i / COL][i % COL],此時ROW = 2, COL = 3;比如 b[2] = a[2/3][2%3] = a[0][2] = 1;
有了這層關系,就可以做了,對一維數組的b[i](i = 0,1,2…… ,N - 1)開始,分別與b[0] - b[N - 1]相加,判斷是否滿足
“不同行不同列”的條件,滿足就把maxVal求出來,與之前的maxVal做比較,把較大的給maxVal,直到比較結束,
如此就可以求出最大值了,時間復雜度為O(N2);
*/
#include <stdio.h>
#include <stdlib.h>
#define ROW 2 //行數
#define COL 3 //列數
//typedef double ArrayType;
int main(void)
{
int a[ROW][COL] = { {1, 3, 1},
{2, 4, 5}};// 給定的二維數組
int iterx = 0, itery = 0;// 用於循環計數控制
int N = ROW * COL; //一維數組的長度
int maxVal = 0;//存儲最大數值
int maxsubF = 0 , maxsubS = 0;// F :First number S: Second number
int x = 0, y = 0; // 保存兩個數字的位置
for(iterx = 0; iterx < N; iterx++)
{
for(itery = 0; itery < N; itery++)
{
maxsubF = a[iterx / COL][iterx % COL];//第一個數F
maxsubS = a[itery / COL][itery % COL];//第二個數S
//不同行不同列的判讀,和最大值的判斷
if(maxsubF + maxsubS > maxVal && (iterx / COL != itery / COL) && (iterx % COL != itery % COL))
{
maxVal = maxsubF + maxsubS;
x = iterx;
y = itery;
}
}
}
printf("The MAX sum is %d \n", maxVal);
printf("first NUM: a[%d][%d] = %d, Second NUM: a[%d][%d] = %d\n", x / COL, x % COL , a[x / COL][x % COL], y / COL, y % COL, a[y / COL][y % COL]);
return 0;
}