您的位置:首页 > 其它

行列有序数组求给定数是否存在

2013-08-14 09:34 148 查看
沿对角线二分,并对独行独列进行优化

输入示例:

样例输入:
3 3
5
1 2 3
4 5 6
7 8 9
3 3
1
2 3 4
5 6 7
8 9 10
3 3
12
2 3 4
5 6 7
8 9 10


样例输出:
Yes
No
No


#include <iostream>
#include <algorithm>
#include <stdio.h>

using namespace std;

const int kMaxM = 1000;
const int kMaxN = 1000;

int array[kMaxM][kMaxN] = {0};
int m, n, k;

bool IsExists(int x1, int y1, int x2, int y2) {
// cout << x1 << " " << y1 << " " << x2 << " " << y2 << endl;
int factx = 1, facty = 1, h = min(x2 - x1, y2 - y1);
if (x1 == x2) {
factx = 0;
facty = 1;
h = y2 - y1;
} else if (y1 == y2) {
factx = 1;
facty = 0;
h = x2 - x1;
}
int l = 0, mid = 0;
bool found = false;
while (l <= h) {
mid = (l + h ) / 2;
if (array[x1 + factx * mid][y1 + facty * mid] > k) {
h = mid - 1;
} else if (array[x1 + factx * mid][y1 + facty * mid] == k) {
return true;
} else {
l = mid + 1;
}
}
if (h < 0) {
return false;
}
if (y1 + h + 1 <= n - 1) {
if (IsExists(x1, y1 + h + 1, x1 + h, y2)) {
return true;
}
}
if (x1 + h + 1 <= m - 1) {
if (IsExists(x1 + h + 1, y1, x2, y1 + h)) {
return true;
}
}
return false;
}

int main() {
while (scanf("%d %d", &m, &n) != EOF) {
scanf("%d", &k);
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &array[i][j]);
}
}
if (IsExists(0, 0, m - 1, n - 1)) {
printf("Yes\n");
} else {
printf("No\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐