有一座可以視為二維的方格平面的長方形城市,由上而下共有 N 列,由左至右共有 M 行,總共劃分為 N × M 個方格。這個城市因為治安很差,所以每個格子中都有機會出現野生的甩棍可以檢拾以方便鬥毆。你想要檢一些甩棍,但你知道城市的其中一些方格設有警察局,如果警察局內的警察在這個方格或與其同一行或同一列的任何方格偵測到有人在檢拾甩棍,都會毫不留情地把撿拾的人預防性羈押,所以為了安全,你絕對不會去那些方格檢拾甩棍。你想要知道在上述條件下,你還可以去那些方格檢拾甩棍。
範例測資
範例輸入 | 範例輸出 |
---|---|
輸入的第一列依序為正整數N 和 M,表示這座城市由上而下共有 N 列,由左至右共有 M 行,總共劃分為 N × M 個方格。 接著共有 N 列,每列為一個長度恰為 M 的字串,每個字元則可能為「•」(ASCII 編碼 46)或「#」(ASCII 編碼 35),若其中第列的第 j 個字元為「#」,表示城市中第列第 j 行的方格設有警察局,否則表示沒設警察局。除此之外,該列不會有其他的字元。 | 請輪出 N 列,每列為長度恰為 M 的字串,對於第 i 列的第 j 個字元,若城市中第 i 列第 j 行的方格可以去撿拾甩棍,則請輪出「X」(英文大寫字母),否則請輸出「#」。請勿輸出其他的字元或空白。 |
2 2 #. .. | ## #X |
3 2 ## .. #. | ## ## ## |
1 4 ..#. | #### |
解題思路
使用二維陣列的方式收字元,收資料的時候可以判斷目前收到的字元是否為「#」,如果是「#」的話就紀錄目前的 i 和 j。
可以宣告兩個 Map<int, int>,一個存 Row,另外一個存 Column。要存的話就是 Row[i]++ 跟 Column[j]++。
收完資料之後再將所有的字元進行判斷,如果目前字元是「#」的話,則輸出「#」。如果目前字元是「.」的話就判斷目前的 Row[i] 跟 Column[j] 是否都是 0,如果都是 0 就可以輸出「X」,否則輸出「#」。
範例程式碼-ZeroJudge C833: 二維陣列
#include <iostream>
#include <vector>
#include <map>
using namespace std;
int main() {
cin.sync_with_stdio(0);
cin.tie(0);
int N, M;
cin >> N >> M;
vector<vector<char>>num;
map<int, int>row, column;
for (int i = 0; i<N; i++)
{
vector<char>v;
for (int j = 0; j<M; j++)
{
char ch;
cin >> ch;
if (ch == '#')
{
row[i]++;
column[j]++;
}
v.push_back(ch);
}
num.push_back(v);
}
for (int i = 0; i<N; i++)
{
for (int j = 0; j<M; j++)
{
if (num[i][j] == '#') cout << '#';
else
{
if (row[i] == 0 && column[j] == 0) cout << 'X';
else cout << '#';
}
}
cout << "\n";
}
}
//ZeroJudge C833
//Dr. SeanXD