@Alllll0235
2017-08-30T10:21:17.000000Z
字数 1166
阅读 1152
learning
#include <iostream>using namespace std;int findRowPeak(int row, int** A, int start, int end){int peak = 0;for(int i = start; i <= end; i++)if(A[row][i]>A[row][peak])peak = i;return peak;}int findColPeak(int col, int** A, int start, int end){int peak = 0;for(int i = start; i <= end; i++)if(A[i][col]>A[peak][col])peak = i;return peak;}int findTwoDimPeak(int**a,int n,int m){//初始化行的二分边界,还有列的二分边界int rowmin = 0, rowmax = n - 1;int colmin = 0, colmax = m - 1;int rowmid,colmid;while(rowmin <= rowmax && colmin <= colmax){//计算行的二分中点rowmid = rowmin + ((rowmax - rowmin) /2);int rowpeak = findRowPeak(rowmid, a, colmin, colmax);if(a[rowmid][rowpeak] < a[rowmid + 1][rowpeak]){rowmin = rowmid + 1;}else if (a[rowmid][rowpeak] < a[rowmid - 1][rowpeak]){rowmax = rowmid - 1;}elsereturn a[rowmid][rowpeak];//计算列的二分中点colmid = colmin + ((colmax - colmin)/2);int colpeak = findColPeak(colmid, a, rowmin, rowmax);if(a[colpeak][colmid] < a[colpeak][colmid + 1]){colmin = colmid + 1;}else if (a[colpeak][colmid] < a[colpeak][colmid - 1]){colmax = colmid - 1;}else return a[colpeak][colmid];}}int main(){int row,col;cout<<"输入矩阵的行数和列数:"<<endl;cin>>row>>col;int **a=new int*[row];for(int i=0;i<row;i++){int *b=new int[col];for(int j=0;j<col;j++)cin>>b[j];a[i]=b;}cout<<"二维峰值为:"<<findTwoDimPeak(a,row,col);return 0;}