分析:既然已经给定了每一行从左至右递增,那么对于每一行直接二分查找即可,一开始还想着每一列同样查找一次,后来发现每一行查找一遍就能够遍历所有的元素了。
#include <cstdlib> #include <cstring> #include <cstdio> #include <iostream> #include <algorithm> #define MaxN 1000 using namespace std; int N, M, x; int a[MaxN+5][MaxN+5]; bool bisearch(int *base, int delta, int l, int r, int val) { int mid, t; while (l <= r) { mid = (l + r) >> 1; t = *(base+delta*mid); if (t < val) l = mid + 1; else if (t > val) r = mid - 1; else return true; } return false; } int main() { bool exsit; while (scanf("%d %d", &N, &M) != EOF) { scanf("%d", &x); exsit = false; for (int i = 0; i < N; ++i) { for (int j = 0; j < M; ++j) { scanf("%d", &a[i][j]); } } for (int i = 0; i < N && !exsit; ++i) { exsit = bisearch((int *)(a+i), 1, 0, M-1, x); } puts(exsit ? "Yes" : "No"); } return 0; }