左程云算法初级课 在排好序的矩阵中找数问题 题目解析和代码实现 宏观调度问题

题目描述:在已经排好序的矩阵中找出指定的数,并输出他在矩阵中的位置

排好序的矩阵:


从左到右,从上到下依次都是递增的。

基本思路:

设置一个点a,从数组的右上位置开始出发,通过比较a位置上的数和给定数的大小关系来确定a点接下来应该往哪个方向走。

如果a位置上的数大于给定的数,那么a应该往左走。假设用上图为例,假设给定的需要求的数是8,那么开始时a应该在13位置,13大于8,那么a应该往左走,走到10位置,为啥呢?因为13是它那一列的最小的一个数,13下面的数都比13大,既然13下面的数都比13大了,那么肯定比8大,所以直接不用看13下面的数了,肯定不等于8.

如果a位置上的数小于给定的数,那么a应该往下走。还是用上图为例,假设a已经走到5位置了,此时5小于8,a应该走到9位置,为啥呢?因为5位置左边的数一定比5小,现在8大于5,那么8肯定大于5位置左边的数,所以直接不用看了。

代码:

#include<bits/stdc++.h>
using namespace std;
int n,m;
int number;//要找的数
int a[9999][9999];
int x,y;//a点的位置
class meat
{
public:
    void hexin()//核心代码
    {
        while(a[x][y]!=number)//当a位置上的数不等于给定的数时,执行下面循环,如果等于给定的数时,说明已经找到了,就不用执行了
        {
            int x1=x;//储存一下当前a点的位置。用当前的a点来判断a点接下来应该走那边。
            int y1=y;
            x=a[x1][y1]>number?x:x+1;//如果不用储存的x1,y1来判断,而是用x,y来判断,结果就有可能错了,因为在这一行判断完成后,x的值就有可能变了,导致下面判断y时所比较的点不是原先的a点了
            y=a[x1][y1]>number?y-1:y;
        }
    }
public:
    void dayin()//打印位置
    {
        cout<<'('<<x<<','<<y<<')';
    }
};
int main()
{
    cin>>n>>m;
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
        cin>>a[i][j];
    cin>>number;
    x=0;y=m-1;//初始化a点的位置
    meat p;
    p.hexin();
    p.dayin();
}

猜你喜欢

转载自blog.csdn.net/qq_40938077/article/details/80207125