標籤:style os for io 演算法 div
這一題給跪,c++死活逾時。。。後來main函數改成用c就好了。。。
演算法:
/*題目描述:在一個二維數組中,每一行都按照從左至右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。輸入:輸入可能包含多個測試範例,對於每個測試案例,輸入的第一行為兩個整數m和n(1<=m,n<=1000):代表將要輸入的矩陣的行數和列數。輸入的第二行包括一個整數t(1<=t<=1000000):代表要尋找的數字。接下來的m行,每行有n個數,代表題目所給出的m行n列的矩陣(矩陣如題目描述所示,每一行都按照從左至右遞增的順序排序,每一列都按照從上到下遞增的順序排序。輸出:對應每個測試案例,輸出”Yes”代表在二維數組中找到了數字t。輸出”No”代表在二維數組中沒有找到數字t。範例輸入:3 351 2 34 5 67 8 93 312 3 45 6 78 9 103 3122 3 45 6 78 9 10範例輸出:YesNoNo-------------------------------------------------原理:每次選取數組右上方的數字進行比較,若該數字比待尋找數字大,那麼刪掉這一列;如果該數字比待尋找數字小,那麼刪除這一行;這樣一來,每次都可以使二維數組減少一行或一列,最終可以尋找到該元素。*/#include<iostream>#include<stdlib.h>#include<stdio.h>using namespace std;#define MAX 1000000bool Find(int arr[],int row,int column,int target){int r,c;if(arr==NULL || row<1 || column<1){return false;}r = 0,c = column-1;while(r<=row-1 && c>=0){if(target == arr[r*column+c]){return true;}else if(target > arr[r*column+c]){r++;}else{c--;}}return false;}int main(){int m,n; while(scanf("%d %d",&m,&n) != EOF) { int key,i; static int matrix[MAX] = {0}; scanf("%d",&key); for(i=0;i<m*n;i++) scanf("%d",matrix+i); bool result = Find(matrix,m,n,key); if(result) printf("Yes\n"); else printf("No\n"); }return 0;}