#include <stdio.h>
int main()
{
int n = 0, m = 0, k = 0;
int i = 0, j = 0;
int arr[1000][1000] = {0}; //空间太大,暂时不知道怎么优化
scanf("%d %d %d", &n, &m, &k); //输入第一行的三个数
for(i=0; i<n; i++) //用了最原始的两层循环来输入矩阵元素,
{
for(j=0; j<m; j++)
scanf("%d ", &arr[i][j]); //逐行输入元素
}
i = 0, j= m-1; //从右上角的那个元素开始比较
while(i < n && j >= 0) //行号有上界,列号有下界
{
if(arr[i][j] == k) //如果找到k
{
printf("Yes\n"); //打印Yes
return 0 ; //直接结束程序,无需其他
}
else if(arr[i][j] < k) //如果该元素更小,那么说明k只会在这个元素的下面
i++; //那就从下面再开始找
else //如果该元素更大,说明k只会在该元素左边
j--; //那就从左边再开始比较
}
printf("No\n");
return 0;
}
假设题中的有序关系为从左至右升序,从上至下升序。关键在于从左下或者右上的元素开始比较,因为在与K比较时,可以由有序关系,可以唯一确定行或列变化的方向,比如右上元素,比它小的在左边,比它大的在下边。而左上或右下的元素,不能唯一确定方向,比左上元素大的可能在右边,也可能在下边。

京公网安备 11010502036488号