題目: Kattis - Prva
出處: (https://open.kattis.com/problems/prva )
有個格子,每個格子有些是字有些是# (代表被阻擋)。
我們要以 一行 或以 一列 去搜尋最短字詞(2個字)。
解題方法:
輸入之後,我先找 一列,再找 一行。
我們需要一個 字串s,存放我們要找的東西。
大概如下:
1 2 3 4 5 6 7 8 9 10 11 12
| #include "iostream" using namespace std;
int main() { int n,m; string s[25]; cin >> n >>m; for (int i=0;i<n;i++) { cin >> s[i]; } }
|
然後先從 一列 開始搜尋。
找 如果不是#的
因為這樣,我們需要兩個字串
- 答案 ans
- 臨時字串 temp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| #include "iostream" using namespace std;
int main() { int n,m; string s[25]; cin >> n >>m; for (int i=0;i<n;i++) { cin >> s[i]; }
string ans="",temp = ""; for(int i=0;i<n;i++) { temp = ""; for(int j=0;j<m;j++) { if(s[i][j] != '#') { temp = temp + s[i][j]; continue; } } } }
|
接下來判斷temp是否有否則他不是一個字
如果有再判斷ans是否為空的
如果是,就令ans = temp
不是的話 比較ans 與 temp中
ans是否有比temp長
如果有,則另ans = temp
如果沒有 ,初始化temp
出迴圈,再做一次判斷的部分
具體做法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| #include "iostream" using namespace std;
int main() { int n,m; string s[25]; cin >> n >>m; for (int i=0;i<n;i++) { cin >> s[i]; } string ans="",temp = ""; for(int i=0;i<n;i++) { temp = ""; for(int j=0;j<m;j++) { if(s[i][j] != '#') { temp = temp + s[i][j]; continue; } if(temp.length() >=2) { if(ans == "" ) { ans =temp; temp = ""; continue; } if(ans > temp) ans = temp; } } if(temp.length() >=2 ){ if(ans == "") { ans = temp; temp = ""; continue; } if (ans > temp) ans = temp; } } }
|
最後一步: 找 一行 的部分。
與列同理,只是將 for迴圈的i j 調轉過來
完整code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| #include "iostream" using namespace std;
int main() { int n,m; cin >> n >> m; string s[25]; for (int i=0;i<n;i++) { cin >> s[i]; } string temp,ans=""; for(int i=0;i<n;i++) { temp = ""; for(int j=0;j<m;j++) { if(s[i][j] != '#') { temp = temp + s[i][j]; continue; } if(temp.length() >=2) { if(ans == "") { ans = temp; temp = ""; continue; } if(ans > temp) ans = temp; } temp = ""; } if(temp.length() >= 2) { if(ans == "") { ans = temp; temp = ""; continue; } if(ans > temp ) ans = temp; } } for(int j=0;j<m;j++) { string temp = ""; for(int i=0;i<n;i++) { if(s[i][j] != '#') { temp = temp + s[i][j]; continue; } if(temp.length() >=2) { if(ans =="") { ans = temp; temp = ""; continue; } if(ans > temp) ans = temp; } temp = ""; } if(temp.length() >=2) { if(ans =="") { ans = temp; temp = ""; continue; } if(ans > temp ) ans = temp; } } cout << ans << "\n"; }
|
註:
- continue是為了讓temp繼續收集字,不然只有一個字的話就不會進去下面的判斷。
- 注意出迴圈的部分。