码迷,mamicode.com
首页 > 编程语言 > 详细

杨氏矩阵定义及其查找的实现C++

时间:2016-09-11 21:33:27      阅读:273      评论:0      收藏:0      [点我收藏+]

标签:

  先介绍一下这个数据结构的定义,Young Tableau有一个m*n的矩阵,然后有一数组 a[k], 其中 k<=m*n ,然后把a[k]中的数填入 m*n 的矩阵中,填充规则为:

1.  每一行每一列都严格单调递增(有其他的版本是递减,其原理相同)。

2.  如果将a[k]中的数填完后,矩阵中仍有空间,则填入 

  举例:

技术分享

  这里主要给出杨氏矩阵的定义和查找

  方法:理由每一列,没一行都是递增的,我们从左上角开始查找,不断的缩小矩阵的大小,最后只剩一1*1的矩阵。

技术分享

  C++代码:

  1 #pragma once
  2 //YoungTableau.h
  3 #include <iostream>
  4 class YoungTableau
  5 {
  6 public:        
  7         YoungTableau(int rows, int columns,int**newTable)
  8         {
  9             x = rows;        //行数
 10             y = columns;    //列数
 11 
 12             if (newTable!=NULL)
 13             {
 14                 table = (int **)((new int[rows*columns]));
 15                 for (int i = 0; i < rows*columns; i++)
 16 
 17                 {
 18                     ((int*)table)[i] = ((int*)newTable)[i];
 19                     std::cout << ((int*)table)[i] << std::endl;
 20                 }
 21                 
 22             }
 23             
 24         };
 25         ~YoungTableau();
 26 private:int x;
 27 private:int y;
 28 private: int **table;
 29 
 30 public:
 31     void print_matrix(void)
 32     {
 33         std::cout <<x<<y << std::endl;
 34         if (table != NULL)
 35         {
 36             for (int i = 0; i < x; i++)
 37                 for (int j = 0; j < y; j++)
 38                     std::cout << ((int*)table)[i*y+j]<<std:: endl;
 39         }
 40     }
 41 public:int get_element(int rows, int columns,int*res)
 42 {
 43     if (res != NULL)
 44     {
 45         if (rows>=this->x || columns >= this->y)
 46         {
 47             *res = 0;
 48             return -1;
 49         }
 50         else
 51         {
 52             *res = ((int*)table)[rows*y + columns];
 53             return 0;
 54         }
 55     }
 56     else
 57     {
 58         *res = 0;
 59         return -2;
 60     }
 61 }
 62 private:bool IsEqualAtLeftTop(int data, int rownum, int columnnum)
 63 {
 64     if (this->table != NULL)
 65     {
 66         if (rownum >= x || columnnum >= y || (rownum == x - 1 && columnnum == 0 && data != ((int*)this->table)[rownum*y + columnnum]))
 67         {
 68             std::cout << "illgal column" << std::endl;
 69             return false;
 70         }
 71         else if (data == ((int*)this->table)[rownum*y + columnnum])
 72         {
 73             return true;
 74         }
 75         else if (data < ((int*)this->table)[rownum*y + columnnum])
 76         {
 77             std::cout << "next column"<< std::endl;
 78             if (columnnum == 0)
 79                 return false;
 80             else 
 81                 return IsEqualAtLeftTop(data, rownum, columnnum - 1);
 82         }
 83         else
 84         {
 85             std::cout << "next row" << std::endl;
 86             if (rownum == x-1)
 87                 return false;
 88             else
 89                 return IsEqualAtLeftTop(data, rownum+1, columnnum);
 90         }
 91 
 92     }
 93     else
 94     {
 95         return false;
 96     }
 97 }
 98 public:bool IsExistence(int data)
 99 {
100     if (this->table != NULL)
101     {
102         /*for (int i = 0; i < x; i++)
103             for (int j = 0; j < y; j++)
104             {
105             if (data == ((int*)table)[i*y + j])
106                 return true;
107             }
108         return false;*/
109         return IsEqualAtLeftTop(data, 0, y - 1);
110     }
111     return false;
112 }
113              
114 };
 1 // Young_Tableau.cpp : 定义控制台应用程序的入口点。
 2 //
 3 
 4 #include "stdafx.h"
 5 #include "YoungTableau.h"
 6 
 7 int _tmain(int argc, _TCHAR* argv[])
 8 {
 9     int tmp_table[3][3] = 
10     {
11         {1, 3, 4 },
12         {2, 3, 6},
13         {5, 8, 10}
14     };
15     YoungTableau matrix(3,3,(int**)tmp_table);
16     matrix.print_matrix();
17     int tmp = 0;
18     matrix.get_element(2,2,&tmp);
19     std::cout << tmp << std::endl;
20 
21     if (matrix.IsExistence(5)==true)
22         std::cout <<"true"<< std::endl;
23     else std::cout << "false" << std::endl;
24     while (1);
25     return 0;
26 }

 

 1 #include "stdafx.h"
 2 #include "YoungTableau.h"
 3 // YoungTableau.cpp : 类的实现
 4 //
 5 
 6 
 7 YoungTableau::~YoungTableau()
 8 {
 9 
10 }

 

杨氏矩阵定义及其查找的实现C++

标签:

原文地址:http://www.cnblogs.com/guiguzhixing/p/5862808.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!