链接https://ac.nowcoder.com/acm/contest/73450/D
题目如上。
此题考查一个图的深度或者广度优先遍历。
此题的难点在于判断是否是一个长方形,我是在广度优先的时候记录了所走过的方块数量cnt,和所有点的最大最小横纵坐标,即maxi,maxj,mini,minj,按照矩形的面积(maxi-mini+1)*(maxj-minj+1),如果cnt等于面积,就代表构成一个矩形。题目较为简单,与LeetCode中一道叫做岛屿数量 的题类似,不一样的就是这道题限定了要求是矩形。 用C++实现的代码如下:
#include<iostream>
#include<vector>
#include<fstream>
#include<queue>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
struct dot {
int i;
int j;
dot(int i, int j) {
this->i = i;
this->j = j;
}
};
bool answer(vector<vector<char>>& Mat,int i, int j,int col,int row) {
int maxi = i,mini = i, minj = j, maxj = j;
int cnt = 1;//计算小方格的个数;
queue<dot>qu;
int dx[] = { 0,1,0,-1 };
int dy[] = { 1,0,-1,0 };
qu.push(dot(i, j));
Mat[i][j] = '*';
while (!qu.empty()) {
dot temp = qu.front(); qu.pop();
for (int k = 0; k < 4; k++) {
int tempX = temp.i + dx[k];
int tempY = temp.j + dy[k];
if (tempX >= 0 && tempX < col && tempY >= 0 && tempY < row && Mat[tempX][tempY] == '.') {
Mat[tempX][tempY] = '*';
cnt++;
qu.push(dot(tempX, tempY));
if (tempX < mini)mini = tempX;
if (tempX > maxi)maxi = tempX;
if (tempY < minj)minj = tempY;
if (tempY > maxj)maxj = tempY;
}
}
}
int width = maxi - mini + 1;
int length = maxj - minj + 1;
return cnt == width * length;
}
int main() {
int col, row;
cin >> col >> row;
char c;
vector<vector<char>>Mat(col);
for (int i = 0; i < col; i++) {
for (int j = 0; j < row; j++) {
cin >> c;
Mat[i].push_back(c);
}
}
int cnt = 0;
for (int i = 0; i < col; i++) {
for (int j =0; j < row; j++) {
if (Mat[i][j] == '.') {
bool a = answer(Mat, i, j, col, row);
if (a) { cnt++; }
}
}
}
cout << cnt;
}