這次的題目是http://e-tutor.itsa.org.tw/e-Tutor/mod/programming/view.php?a=15491
[C_RU33-中] 安全地點
問題描述 :
假設一張平面圖由下面幾種符號來表示平面狀況:1:牆壁,0:走道,b:小炸彈(範圍3X3內的水平與垂直線,碰到牆壁無法穿透),B:大炸彈(範圍是水平與垂直線,但是同樣碰到牆壁無法穿透),請檢查所有炸彈爆炸之後,平面圖上面殘存仍然為0的安全地點。假設一個平面圖如下所示:
111111111111
100000111001
111110100001
1000b00b1111
100001000001
1000B1100101
10000000B001
111111111111
當所有炸彈引爆後的結果如下:
111111111111
100000111001
1111101x0001
100xbxxb1111
1000x10xx001
1xxxB110x101
1xxxxxxxBxx1
111111111111
平面圖上剩餘0的個數為21,因此輸出結果為21。
輸入說明 :
第一行為平面圖的行數 N ( N ≤ 20 ),接著有 N 行由 0 、 1 、 b 、 B 組成的字串,平面圖四周都是牆壁,每一行長度不會超過 20 個字元。
輸出說明 :
輸出所有炸彈爆炸後仍為 0 的安全地點。
範例 :
輸入範例 |
輸出範例 |
8 |
21 |
雖然有規定先輸入行數,再根據行數,輸入每一行卻沒有規定字數
所以每一行的輸入就用字串輸入
再宣告vector的字串型別陣列
那這個陣列就會變成二維
之後用迴圈走訪陣列,當是b的時候傳進函式f()裡
f()寫的是把上下左右四個方向各一格,是0的都變成x
如果是B就傳進F()裡
F()則是把上下左右四個方向的所有0都變x,並且當遇到1就停止
最後計算陣列剩下的0,再印出
這題就解決了
- #include <iostream>
- #include <string.h>
- #include <vector>
- using namespace std;
- void f(vector<string>&arr,int a,int b);
- void F(vector<string>&arr,int a,int b,int c);
- int main()
- {
- int num;
- cin>>num;
- cin.get();
- vector<string>arr;
- for(int i=0;i<num;i++)
- {
- string input;
- getline(cin,input);
- arr.push_back(input);
- }
- for(int i=0;i<num;i++)
- {
- for(int j=0;j<arr[i].size();j++)
- {
- if(arr[i][j]=='b')
- {
- f(arr,i,j);
- }
- else if(arr[i][j]=='B')
- {
- F(arr,i,j,num);
- }
- }
- }
- int c=0;
- for(int i=0;i<arr.size();i++)
- {
- for(int j=0;j<arr[i].size();j++)
- {
- if(arr[i][j]=='0')
- c++;
- }
- }
- cout<<c<<endl;
- return 0;
- }
- void f(vector<string>&arr,int a,int b)
- {
- if(arr[a][b+1]=='0')
- arr[a][b+1]='x';
- if(arr[a-1][b]=='0')
- arr[a-1][b]='x';
- if(arr[a][b-1]=='0')
- arr[a][b-1]='x';
- if(arr[a+1][b]=='0')
- arr[a+1][b]='x';
- }
- void F(vector<string>&arr,int a,int b,int c)
- {
- for(int k=b+1;k<arr[a].size();k++)
- {
- if(arr[a][k]=='1')
- break;
- else if(arr[a][k]=='0')
- arr[a][k]='x';
- }
- for(int k=a+1;k<c;k++)
- {
- if(arr[k][b]=='1')
- break;
- else if(arr[k][b]=='0')
- arr[k][b]='x';
- }
- for(int k=a-1;k>=0;k--)
- {
- if(arr[k][b]=='1')
- break;
- else if(arr[k][b]=='0')
- arr[k][b]='x';
- }
- for(int k=b-1;k>=0;k--)
- {
- if(arr[a][k]=='1')
- break;
- else if(arr[a][k]=='0')
- arr[a][k]='x';
- }
- }
若想閱讀相關文章請關注我的粉絲團
小資菜鳥向前衝
留言列表