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