今天閒來無事,看了看王道論壇上的機試題,嘗試著做了兩道,還不錯,就是好久沒做了,都沒什麼感覺了,要先找找手感!鍛煉一下! 題目描述: 在一個二維數組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。 輸入: 輸入可能包含多個測試樣例,對於每個測試案例, 輸入的第一行為兩個整數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 解答:其實剛拿到這個問題,想的很簡單,有以下幾個思路: 1.每行每列都是有序的數組,我們可以對每一行進行二分查找,先比速度也不會太慢; 2.按圖索骥,從一個切入點入手,開始尋找當前數字與目標數字的大小關系,之後就可以決定當前的搜索路徑按照那個方向走下去; 話不多說,提交代碼:
#include <iostream> #include <time.h> #include <stdlib.h> #include <stdio.h> #include <vector> using namespace std; int num[1000][1000]; int main() { int rows = 0, cols = 0; vector<bool> m_flag; while(scanf("%d %d\n", &rows, &cols) != EOF) { int target = 0; scanf("%d\n",&target); int i = 0,j = 0; for(i=0; i<rows; i++) for(j=0; j<cols; j++) scanf("%d",&num[i][j]); bool found = false; int row = 0,col = cols-1; while(row < rows && col >= 0) { if(num[row][col] == target) { found = true; break; } else { if(num[row][col] > target) col--; else row++; } } /* if(found == true) cout << "Yes" << endl; else cout << "No" << endl; */ m_flag.push_back(found); } for(size_t i=0;i<m_flag.size();i++) if(m_flag[i] == true) cout << "Yes" << endl; else cout << "No" << endl; return 0; }