例如如下输入:
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,则上面的红色区域被抛弃
#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