這次的題目是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
111111111111
100000111001
111110100001
1000b00b1111
100001000001
1000B1100101
10000000B001
111111111111

21

 

雖然有規定先輸入行數,再根據行數,輸入每一行卻沒有規定字數

所以每一行的輸入就用字串輸入

再宣告vector的字串型別陣列

那這個陣列就會變成二維

之後用迴圈走訪陣列,當是b的時候傳進函式f()裡

f()寫的是把上下左右四個方向各一格,是0的都變成x

如果是B就傳進F()裡

F()則是把上下左右四個方向的所有0都變x,並且當遇到1就停止

最後計算陣列剩下的0,再印出

這題就解決了

  1. #include <iostream>  
  2. #include <string.h>  
  3. #include <vector>  
  4. using namespace std;  
  5. void f(vector<string>&arr,int a,int b);  
  6. void F(vector<string>&arr,int a,int b,int c);  
  7. int main()  
  8. {  
  9.     int num;  
  10.     cin>>num;  
  11.     cin.get();  
  12.     vector<string>arr;  
  13.     for(int i=0;i<num;i++)  
  14.     {  
  15.         string input;  
  16.         getline(cin,input);  
  17.         arr.push_back(input);  
  18.     }  
  19.     for(int i=0;i<num;i++)  
  20.     {  
  21.         for(int j=0;j<arr[i].size();j++)  
  22.         {  
  23.             if(arr[i][j]=='b')  
  24.             {  
  25.                 f(arr,i,j);  
  26.             }  
  27.             else if(arr[i][j]=='B')  
  28.             {  
  29.                 F(arr,i,j,num);  
  30.             }  
  31.         }  
  32.     }  
  33.     int c=0;  
  34.     for(int i=0;i<arr.size();i++)  
  35.     {  
  36.         for(int j=0;j<arr[i].size();j++)  
  37.         {  
  38.             if(arr[i][j]=='0')  
  39.                 c++;  
  40.         }  
  41.     }  
  42.     cout<<c<<endl;  
  43.     return 0;  
  44. }  
  45. void f(vector<string>&arr,int a,int b)  
  46. {  
  47.     if(arr[a][b+1]=='0')  
  48.         arr[a][b+1]='x';  
  49.     if(arr[a-1][b]=='0')  
  50.         arr[a-1][b]='x';  
  51.     if(arr[a][b-1]=='0')  
  52.         arr[a][b-1]='x';  
  53.     if(arr[a+1][b]=='0')  
  54.         arr[a+1][b]='x';  
  55. }  
  56. void F(vector<string>&arr,int a,int b,int c)  
  57. {  
  58.     for(int k=b+1;k<arr[a].size();k++)  
  59.     {  
  60.         if(arr[a][k]=='1')  
  61.             break;  
  62.         else if(arr[a][k]=='0')  
  63.             arr[a][k]='x';  
  64.     }  
  65.     for(int k=a+1;k<c;k++)  
  66.     {  
  67.         if(arr[k][b]=='1')  
  68.             break;  
  69.         else if(arr[k][b]=='0')  
  70.             arr[k][b]='x';  
  71.     }  
  72.     for(int k=a-1;k>=0;k--)  
  73.     {  
  74.         if(arr[k][b]=='1')  
  75.             break;  
  76.         else if(arr[k][b]=='0')  
  77.             arr[k][b]='x';  
  78.     }  
  79.     for(int k=b-1;k>=0;k--)  
  80.     {  
  81.         if(arr[a][k]=='1')  
  82.             break;  
  83.         else if(arr[a][k]=='0')  
  84.             arr[a][k]='x';  
  85.     }  
  86. }  

 

若想閱讀相關文章請關注我的粉絲團

小資菜鳥向前衝

https://www.facebook.com/%E5%B0%8F%E8%B3%87%E8%8F%9C%E9%B3%A5%E5%90%91%E5%89%8D%E8%A1%9D-204484273323335/?fref=ts

文章標籤
創作者介紹

cychss6305的部落格

cychss6305 發表在 痞客邦 PIXNET 留言(0) 人氣()