C++找出一個二維陣列中的鞍點,即該位置上的元素在該行上最大,在該列上最小(也可能沒有鞍點)
今日正式用csdn部落格記錄,回顧我所學到的知識,分享一些我的人生感悟和自身經歷。也希望未來通夠過此平臺和更多喜愛程式設計的人交流學習。
道聽途說再加上自己的感悟,認為程式設計最重要的是思想,而不是語言本身,語言只是個工具。所以我們得先學思想。遇到問題,應該先想如果是自己去做會怎麼處理,但我們不能一步到位,因為計算機並不會做一步到位,他最擅長的是迭代,所以我們要問題分解許多基本的步驟,然後一步一步去執行,其實我們人類也一樣,遇到大的困難,我們不能慌,我們想辦法將困難分解,一點一點的去解決困難,這樣我們沒解決一個小問題帶來的成就感會鼓舞我們去解決下一個小問題,一個一個的小問題解決了,自然大的問題就迎刃而解了。所以現在我們將問題分解,在矩陣裡面找一個元素,這個元素在該行上最大,在該列上最小。我們先找一行的最大值,然後找行最大值所在的列,最後找行最大值所在列有沒有比它小的值,如果有就存在鞍點。
我們假設有n行m列
//用來判斷行最大值所在的列的程式碼如下
for(j=0;j<m;j++)
{
if(a[i][j]>max)
{
max=a[i][j];
maxj=j;
}
}
flag ture;
//確定列後用來和它所在的這一整列進行比較,這裡設定了一個布林變數。
for(k=0;k<m;k++)
{
if(max>a[k][maxj])
{
flag=false;
continue;
}
}
判斷完這一行還沒完事,我們需要判斷完每一行。所以需要對上邊的程式進行迭代,用一個for迴圈就可以實現了。以下是全部程式碼,親測執行成功
#include<iostream>
using namespace std;
int main()
{
const int n=4,m=5;
int i,j,k,a[n][m],max,maxj;
bool flag;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
cin>>a[i][j];
for(i=0;i<n;i++)
{
max=a[i][0],maxj=0;
for(j=0;j<m;j++)
{
if(a[i][j]>max)
{
max=a[i][j];
maxj=j;
}
}
flag=true;
for(k=0;k<n;k++)
{
if(max>a[k][maxj])
{
flag=false;
continue;
}
}
if(flag)
{
cout<<"a["<<i<<"]["<<"["<<maxj<<"]="<<max<<endl;
break;
}
}
if(!flag)
cout<<"it does not exist"<<endl;
return 0;
}