暴力搜索 寻找鞍点

暴力搜索 寻找鞍点

前一段时间参加了个小笔试,最后有一道编程题挺好玩儿,在此记录一下。如果还有什么更好的方法,希望各位看官不吝赐教。

题目:

找出一个二维数组中的鞍点,即该位置上的元素在该行上最大、在该列上最小。也可能没有鞍点。

输入描述:

输入有多组数据。每组数据的第一行包含两个整数,m 和 n。紧接着是 mxn(1≤m, n≤50)的矩阵。

输出描述:

对应每组数据,按照从上到下、从左到右的顺序依次输出所有鞍点的座标(从1开始)。如果没有任何鞍点,输出 “No Point”。每组数据之后输出一个空行作为间隔。

输入例子:

3 4
55 68 54 82
52 66 43 66
48 77 83 70
2 3
1 2 3
4 5 6

输出例子:

2 2
2 4

1 3

思路:暴力搜索。

因为每行每列都肯能有多个鞍点,例子如下:

6 6 6
6 6 6
6 6 6

代码:

#include <vector>
#include <iostream>
using namespace std;

void FindPoint(int m, int n)
{
  if((m == 0) && (n == 0))
  {
    cout<<"No Point"<<endl;
    return;
  }

  int count = 0;
  int num;
  vector<vector<int>> nums(m, vector<int>(n, 0));
  for(int i = 0; i < m; ++i)
  {
    for(int j = 0; j < n; ++j)
    {
      cin>>num;
      nums[i][j] = num;
    }
  }

  for(int i = 0; i < m; ++i)
  {
    for(int j = 0; j < n; ++j)
    {
      int k;
      for(k = 0; k < n; ++k)
      {
        if(nums[i][j] < nums[i][k])
        {
          break;
        }
      }
      if(k != n)
      {
        continue;
      }

      int l;
      for(l = 0; l < m; ++l)
      {
        if(nums[i][j] > nums[l][j])
        {
          break;
        }
      }
      if(l != m)
      {
        continue;
      }

      ++count;
      cout<< i + 1 << " " << j + 1 << endl;
    }
  }

  if(count == 0)
  {
    cout<<"No Point"<<endl;
  }
  cout<<endl;
  return;
}

int main()
{
  int m, n;
  while(cin>> m >> n)
  {
    FindPoint(m, n);
  }
  return 0;
}
点赞