尋找一個二維陣列鞍點的演算法實現
阿新 • • 發佈:2019-01-31
題目:找出一個二維陣列中的鞍點(即該位置上的元素在該行上最大,在該列上最小)。一個二維陣列最多隻有一個鞍點,也可能沒有鞍點。
分析:我們可以定義兩個函式,一個為判斷該元素是否是行最大元素,一個判斷該元素是否是列最小元素;然後在main函式中採用巢狀for迴圈讓每一個元素都呼叫這兩個函式,以這兩個函式的返回值作為判斷條件,如果兩個函式返回值的邏輯與為真,那麼就可以說該元素為鞍點,否則,說明不是鞍點。
程式碼如下:(VS2013)
程式碼如下:(VS2013)
#include "stdafx.h" #include <iostream> using namespace std; #define M 5 #define N 4 /*找出一個二維陣列的鞍點(至多一個,可能沒有)*/ int IsRowMax(int a[M][N], int i, int j); int IsColMin(int a[M][N], int i, int j); int _tmain(int argc, _TCHAR* argv[]) { int a[M][N]; int i, j; bool flag = false; //是否有鞍點的標誌 cout << "請輸入5*4個元素:" << endl; for (i = 0; i < M; i++) //建立二維陣列 { for (j = 0; j < N; j++) cin >> a[i][j]; } cout << "原始陣列為:" << endl; for (i = 0; i < M; i++) //輸出原始陣列 { for (j = 0; j < N; j++) cout << a[i][j] << " "; cout << endl; } for (i = 0; i < M; i++) //採用巢狀for結構,遍歷每個元素,判斷是否是鞍點 { for (j = 0; j < N; j++) { if (IsRowMax(a, i, j) && IsColMin(a,i,j)) //兩個條件都為真,說明該點是鞍點 { cout << "鞍點為:" << "a[" << i << "][" << j << "]=" << a[i][j] << endl; flag = true; } } } if (!flag) cout << "沒有鞍點" << endl; return 0; } int IsRowMax(int a[M][N],int i,int j) //判斷是否是行最大,行號i不變,列號j變化 { int k, s = 1; for (k = 0; k < N; k++) { if (a[i][k]>a[i][j]) //只要一行中,有一個元素大於指定元素,那麼該元素就不是改行中的最大值,返回0,結束迴圈比較 { s = 0; break; } } return s; } int IsColMin(int a[M][N], int i, int j) //判斷是否為列最小,行號i變化,列號j不變 { int k, s = 1; for (k = 0; k < M; k++) { if (a[k][j] < a[i][j]) //只要一列中,有一個元素小於指定元素,那麼該元素就不是該列的最小值,返回0,結束迴圈比較 { s = 0; break; } } return s; }