1. 程式人生 > 其它 >程式設計與演算法(一)測驗彙總(2021秋季)-《032:計算鞍點》的一點思考

程式設計與演算法(一)測驗彙總(2021秋季)-《032:計算鞍點》的一點思考

給定一個5*5的矩陣,每行只有一個最大值,每列只有一個最小值,尋找這個矩陣的鞍點。鞍點指的是矩陣中的一個元素,它是所在行的最大值,並且是所在列的最小值。

計算鞍點

本題為程式設計與演算法(一)的測驗習題,編號032,具體問題見下,引用自OJ

總時間限制: 1000ms 記憶體限制: 65536kB

描述

給定一個5*5的矩陣,每行只有一個最大值,每列只有一個最小值,尋找這個矩陣的鞍點。
鞍點指的是矩陣中的一個元素,它是所在行的最大值,並且是所在列的最小值。
例如:在下面的例子中(第4行第1列的元素就是鞍點,值為8 )。
11 3 5 6 9
12 4 7 8 10
10 5 6 9 11
8 6 4 7 2
15 10 11 20 25

輸入

輸入包含一個5行5列的矩陣

輸出

如果存在鞍點,輸出鞍點所在的行、列及其值,如果不存在,輸出"not found"

樣例輸入

11 3 5 6 9
12 4 7 8 10
10 5 6 9 11
8  6 4 7 2
15 10 11 20 25

樣例輸出

4 1 8

這個問題的首先要做的操作就是,讀入陣列,之後,按行找出當前行的最大值,再按列找出當前列的最小值。

到這之後,我停止了思考,我一時間沒辦法找到每行最大值和每列最小值有什麼關係,轉而陷入到了為了找尋關係而繞來繞去的思路。

先看正常情況下,如何建立聯絡。目標輸出的是鞍點的索引及其值。注意到鞍點必須具備兩種性質:當前行最大,當前列最小。並且題目已經給出限制,每行、每列只有一個極值。所以,找到每行的最大值,再按列遍歷,如果每列的最小值和當前的行最大值相等則一定是鞍點,且唯一。如果對行遍歷完之後,沒有找到鞍點,則不存在,即not found.

以上判斷方法來自:Mariclery的帖子,內包含程式碼可供查閱。

接下來我要說的是我當時腦子是如何轉了個大彎找到奇葩判斷方法:

首先,讀入陣列後,並沒有將每行最大值的值和每列最小值的值記錄,記錄的是值對應的索引,兩個陣列分別存放每行最大值對應的列索引,和每列最小值對應的行索引。唉,說到這就繞繞的。

接下來,不同於上面老哥的按列遍歷,用每行最大值檢驗是否為鞍點,我的想法是將行最大值座標順序列出,列最小座標順序列出,如果某點是鞍點,則該行(列)的最大列(最小行)座標索引對應的最小行(最大列)座標索引必將等於當前遍歷的行(列)索引i

這也太繞了。

舉個例子:

(0,a) (1,b) (2,c) (3,d) (4,e) 為每行最大值的座標,第一個位置是0~4的行號索引,第二個位置是每行最大值的列索引。
(A,0) (B,1) (C,2) (D,3) (E,4) 為每列最小值的座標,第一個位置是每列最小值的列索引,第二個位置是0~4的列號索引。

如果 (B,1)是鞍點,則第一行座標中,B作為行最大值座標的行索引,即,第一個座標值等於B的點的第二個座標值(列索引)一定等於i。

如果用max[5]存放a~e,min[5]存放A~E,可將上述關係寫作:

若(min[i],i)是鞍點,則必有max[min[i]]==i

或者:

若(i,max[i])是鞍點,則必有min[max[i]]==i

試圖描述清楚這種關係是費勁的。我也因為一時的腦抽,陷入找索引之間的關係遲遲沒有結果,時間久,想的腦子也痛。

下面放出原始碼:

#include<cstdio>
int main(){
	int a[5][5];
	for(int i=0;i<5;i++)	for(int j=0;j<5;j++)	scanf("%d",&a[i][j]);
	int max_r[5],min_c[5];
	for(int i;i<5;i++) max_r[i]=0,min_c[i]=0;
	for(int i=0;i<5;i++){
		for (int j=0;j<5;j++){
			if(a[i][j]>a[i][max_r[i]]) max_r[i]=j;//儲存每行的最大值的列索引
			if(a[j][i]<a[min_c[i]][i]) min_c[i]=j;//儲存每列的最小值的行索引
		}
	}
	for(int i=0;i<5;i++) if(max_r[min_c[i]]==i) // 若(min[i],i)是鞍點,則必有max[min[i]]==i
	{
		printf("%d %d %d\n",min_c[i]+1,i+1,a[min_c[i]][i]);
		return 0;
	}
	else if(i==4) printf("not found");
	return 0;
}
作者:drzrunze 出處:http://www.cnblogs.com/drzrunze/ 本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須在文章頁面給出原文連結,否則保留追究法律責任的權利。