#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比较时,可以由有序关系,可以唯一确定行或列变化的方向,比如右上元素,比它小的在左边,比它大的在下边。而左上或右下的元素,不能唯一确定方向,比左上元素大的可能在右边,也可能在下边。