1. 程式人生 > >尋找一個二維陣列鞍點的演算法實現

尋找一個二維陣列鞍點的演算法實現

題目:找出一個二維陣列中的鞍點(即該位置上的元素在該行上最大,在該列上最小)。一個二維陣列最多隻有一個鞍點,也可能沒有鞍點。 分析:我們可以定義兩個函式,一個為判斷該元素是否是行最大元素,一個判斷該元素是否是列最小元素;然後在main函式中採用巢狀for迴圈讓每一個元素都呼叫這兩個函式,以這兩個函式的返回值作為判斷條件,如果兩個函式返回值的邏輯與為真,那麼就可以說該元素為鞍點,否則,說明不是鞍點。
程式碼如下:(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;
}