二维矩阵(杨氏矩阵)查找 、定义: 从左到右,从上到下,依次增大的矩阵

本文主要是介绍二维矩阵(杨氏矩阵)查找 、定义: 从左到右,从上到下,依次增大的矩阵,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

查找某元素

假设矩阵为

                   1     2   8   9

                   2    4    9   12

                   4    7   10  13

                   6    8    11  15

    在里面查找7,如果我们从1开始,则1的右半部分,也就是剩下矩阵的全体,都可能会存在7,这是显然不行的,我们要确定一个确切的查找规则,它沿着特定路线走,最后找到

    我们看其规律,如果说要查找的元素比当前元素大,则在其右半部与下半部   如果比当前元素小,则在其左半部与上半部。

    而如果我们从右上角开始,9开始,查找7,首先7小于9,所以要在其左半部分与上半部分查找,9的上半部分是没有的,左半部分就是第1 2 3 列,第4列排除掉(注意这个排除掉的意思,意思是说7不可能在这里了)

   我们往左走到8,7比8小,同样我们还得往左走,那就是2,

  7比2大,所以我们就找右下两部分,右半部分,第3 4 列,我们其实前面已经排除了,只剩下下边的,于是我们从2开始往下走,走到了4

  ······以此类推

   杨氏矩阵难点在于如何选择起始点,以及为什么要选择这个起始点。这一点一定要搞清楚。

  我们这里找到大于要寻找的元素,不再为向下还是向右犹豫不决了,我们只需要向下,碰到小于要寻找的元素也是如此。

  

[cpp]  view plain copy
  1. #include <iostream>  
  2. #include <algorithm>  
  3. using namespace std;  
  4. int a[4][4]={{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};  
  5. int k=0;  
  6. bool findElem(int row,int col)  
  7. {  
  8.   while((row>=0&&row<4)&&(col>0&&col<4))  
  9.   {  
  10.     if(a[row][col]=k)  
  11.         return true;  
  12.     if(a[row][col]<k)  
  13.     {  
  14.       row++;  
  15.     }  
  16.     else  
  17.         col--;  
  18.   }  
  19.   return false;  
  20. }  
  21. int main()  
  22. {  
  23.   
  24.   if(findElem(0,3))  
  25.       cout<<"find it"<<endl;  
  26.   else  
  27.       cout<<"could not find it"<<endl;  
  28.   return 0;  
  29. }  

这篇关于二维矩阵(杨氏矩阵)查找 、定义: 从左到右,从上到下,依次增大的矩阵的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/245951

相关文章

poj2576(二维背包)

题意:n个人分成两组,两组人数只差小于1 , 并且体重只差最小 对于人数要求恰好装满,对于体重要求尽量多,一开始没做出来,看了下解题,按照自己的感觉写,然后a了 状态转移方程:dp[i][j] = max(dp[i][j],dp[i-1][j-c[k]]+c[k]);其中i表示人数,j表示背包容量,k表示输入的体重的 代码如下: #include<iostream>#include<

hdu2159(二维背包)

这是我的第一道二维背包题,没想到自己一下子就A了,但是代码写的比较乱,下面的代码是我有重新修改的 状态转移:dp[i][j] = max(dp[i][j], dp[i-1][j-c[z]]+v[z]); 其中dp[i][j]表示,打了i个怪物,消耗j的耐力值,所得到的最大经验值 代码如下: #include<iostream>#include<algorithm>#include<

hdu 4565 推倒公式+矩阵快速幂

题意 求下式的值: Sn=⌈ (a+b√)n⌉%m S_n = \lceil\ (a + \sqrt{b}) ^ n \rceil\% m 其中: 0<a,m<215 0< a, m < 2^{15} 0<b,n<231 0 < b, n < 2^{31} (a−1)2<b<a2 (a-1)^2< b < a^2 解析 令: An=(a+b√)n A_n = (a +

HDU 2159 二维完全背包

FATE 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务。久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级。现在的问题是,xhd升掉最后一级还需n的经验值,xhd还留有m的忍耐度,每杀一个怪xhd会得到相应的经验,并减掉相应的忍耐度。当忍耐度降到0或者0以下时,xhd就不会玩这游戏。xhd还说了他最多只杀s只怪。请问他能

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

hdu 6198 dfs枚举找规律+矩阵乘法

number number number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description We define a sequence  F : ⋅   F0=0,F1=1 ; ⋅   Fn=Fn

Verybot之OpenCV应用二:霍夫变换查找圆

其实我是想通过这个程序来测试一下,OpenCV在Verybot上跑得怎么样,霍夫变换的原理就不多说了,下面是程序: #include "cv.h"#include "highgui.h"#include "stdio.h"int main(int argc, char** argv){cvNamedWindow("vedio",0);CvCapture* capture;i

浙大数据结构:树的定义与操作

四种遍历 #include<iostream>#include<queue>using namespace std;typedef struct treenode *BinTree;typedef BinTree position;typedef int ElementType;struct treenode{ElementType data;BinTree left;BinTre

类和对象的定义和调用演示(C++)

我习惯把类的定义放在头文件中 Student.h #define _CRT_SECURE_NO_WARNINGS#include <string>using namespace std;class student{public:char m_name[25];int m_age;int m_score;char* get_name(){return m_name;}int set_name

c++ 定义二位数组

在 C++ 中,定义二维数组有几种常见的方式。以下是几个示例: 1. 静态二维数组 定义: int array[3][4]; 这里,array 是一个 3 行 4 列的整数二维数组。 初始化: int array[3][4] = {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}}; 2. 动态二维数组 使用指针和动态内存分配: 定义: