在行列都排好序的矩阵中里面需找某个元素

例如如下输入:

  1   5   7    10 

  2   6   8   15

  4   9  11  16

12 13 19  21

输入满足按行来看,是递增排序,按列也是递增排序。现在要找到某个元素,如果存在输出坐标。

分治法。

1

5

7

10

2

6

8

15

4

9

11

16

12

13

19

21

当前的中间数为绿色的方格8

若查找的数小于8,则下面的蓝色区域被抛弃

若查找的数大于8,则上面的红色区域被抛弃

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



bool search(int a[][4], int rlow, int rupper, int clow, int cupper, int query, int &r, int &c);

int main()
{
	
	int a[][4] = {{1, 5, 7, 10}, {2, 6, 8, 15}, {4, 9, 11, 16}, {12, 13, 19, 21}}; //size is 9
	
	int row = 3, col = 3;
	for(int i = 0; i < 16; i++)
	{
		int r, c;
		if(!search(a, 0, 3, 0, 3, i, r, c))
		{
			printf("Can't find %d in matrix\n", i);
			continue;
		}
		printf("Find %d in matrix, the row is %d, the column is %d\n", i, r, c);
	}
	return 0;
}

bool search(int a[][4], int rlow, int rupper, int clow, int cupper, int query, int &r, int &c)
{
	int rmid, cmid;
	if(rlow <= rupper && clow <= cupper)
	{
		rmid = rlow + ((rupper - rlow) >> 1);
		cmid = clow + ((cupper - clow) >> 1);
		if(query == a[rmid][cmid])
		{
			r = rmid;
			c = cmid;
			return true;
		}
		
		
		if(query < a[rmid][cmid])
			return (search(a, rlow, rmid - 1, clow, cmid - 1, query, r, c) || search(a, rmid, rmid, clow, cmid - 1, query, r, c)
					|| search(a, rlow, rmid - 1, cmid, cmid, query, r, c) || search(a, rmid + 1, rupper, clow, cmid - 1, query, r, c)
					|| search(a, rlow, rmid - 1, cmid + 1, cupper, query, r, c));
			
		else
			return (search(a, rmid + 1, rupper, cmid + 1, cupper, query, r, c) || search(a, rmid + 1, rupper, cmid, cmid, query, r, c)
					|| search(a, rmid, rmid, cmid + 1, cupper, query, r, c) || search(a, rmid + 1, rupper, clow, cmid - 1, query, r, c)
					|| search(a, rlow, rmid - 1, cmid + 1, cupper, query, r, c));
	}
	return false;
}

输出结果:

Can't find 0 in matrix
Find 1 in matrix, the row is 0, the column is 0
Find 2 in matrix, the row is 1, the column is 0
Can't find 3 in matrix
Find 4 in matrix, the row is 2, the column is 0
Find 5 in matrix, the row is 0, the column is 1
Find 6 in matrix, the row is 1, the column is 1
Find 7 in matrix, the row is 0, the column is 2
Find 8 in matrix, the row is 1, the column is 2
Find 9 in matrix, the row is 2, the column is 1
Find 10 in matrix, the row is 0, the column is 3
Find 11 in matrix, the row is 2, the column is 2
Find 12 in matrix, the row is 3, the column is 0
Find 13 in matrix, the row is 3, the column is 1
Can't find 14 in matrix
Find 15 in matrix, the row is 1, the column is 3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值