暴力搜索 寻找鞍点
前一段时间参加了个小笔试,最后有一道编程题挺好玩儿,在此记录一下。如果还有什么更好的方法,希望各位看官不吝赐教。
题目:
找出一个二维数组中的鞍点,即该位置上的元素在该行上最大、在该列上最小。也可能没有鞍点。
输入描述:
输入有多组数据。每组数据的第一行包含两个整数,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;
}