[关闭]
@Alllll0235 2017-08-30T10:21:17.000000Z 字数 1166 阅读 779

寻找二维峰值

learning


  1. #include <iostream>
  2. using namespace std;
  3. int findRowPeak(int row, int** A, int start, int end)
  4. {
  5. int peak = 0;
  6. for(int i = start; i <= end; i++)
  7. if(A[row][i]>A[row][peak])
  8. peak = i;
  9. return peak;
  10. }
  11. int findColPeak(int col, int** A, int start, int end)
  12. {
  13. int peak = 0;
  14. for(int i = start; i <= end; i++)
  15. if(A[i][col]>A[peak][col])
  16. peak = i;
  17. return peak;
  18. }
  19. int findTwoDimPeak(int**a,int n,int m)
  20. {
  21. //初始化行的二分边界,还有列的二分边界
  22. int rowmin = 0, rowmax = n - 1;
  23. int colmin = 0, colmax = m - 1;
  24. int rowmid,colmid;
  25. while(rowmin <= rowmax && colmin <= colmax)
  26. {
  27. //计算行的二分中点
  28. rowmid = rowmin + ((rowmax - rowmin) /2);
  29. int rowpeak = findRowPeak(rowmid, a, colmin, colmax);
  30. if(a[rowmid][rowpeak] < a[rowmid + 1][rowpeak])
  31. {
  32. rowmin = rowmid + 1;
  33. }
  34. else if (a[rowmid][rowpeak] < a[rowmid - 1][rowpeak])
  35. {
  36. rowmax = rowmid - 1;
  37. }
  38. else
  39. return a[rowmid][rowpeak];
  40. //计算列的二分中点
  41. colmid = colmin + ((colmax - colmin)/2);
  42. int colpeak = findColPeak(colmid, a, rowmin, rowmax);
  43. if(a[colpeak][colmid] < a[colpeak][colmid + 1])
  44. {
  45. colmin = colmid + 1;
  46. }
  47. else if (a[colpeak][colmid] < a[colpeak][colmid - 1])
  48. {
  49. colmax = colmid - 1;
  50. }
  51. else return a[colpeak][colmid];
  52. }
  53. }
  54. int main()
  55. {
  56. int row,col;
  57. cout<<"输入矩阵的行数和列数:"<<endl;
  58. cin>>row>>col;
  59. int **a=new int*[row];
  60. for(int i=0;i<row;i++)
  61. {
  62. int *b=new int[col];
  63. for(int j=0;j<col;j++)
  64. cin>>b[j];
  65. a[i]=b;
  66. }
  67. cout<<"二维峰值为:"<<findTwoDimPeak(a,row,col);
  68. return 0;
  69. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注