题意:
给出一张图,模仿windows窗口程序,问有哪些窗口未被其他窗口覆盖。
解路:
暴力枚举,先找到窗口的左上角,然后枚举出长宽,再判断边框是否等于左上角字母,再判断边框里面,是否只有’.’。
AC代码
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <cctype>
#include <vector>
using namespace std;
const int N = 105;
bool vis[N][N];
char grid[N][N];
int n, m;
vector<char> vec;
void init() {
vec.clear();
memset(vis, false, sizeof(vis));
memset(grid, 0, sizeof(grid));
}
int downMost(int x, int y) {
for(int i = x; i < n; i++) {
if(grid[i][y] != grid[x][y])
return i-1;
}
return n-1;
}
int rightMost(int x, int y) {
for(int j = y; j < m; j++) {
if(grid[x][j] != grid[x][y])
return j-1;
}
return m-1;
}
bool check(int x, int y) {
int x2 = downMost(x, y), y2 = rightMost(x, y);
if(abs(x2 - x) < 2 || abs(y2 - y) < 2) return false;
bool ok = true;
for(int i = x; i <= x2; i++) {
if(grid[i][y] != grid[x][y]) {
ok = false;
}else vis[i][y] = true;
}
for(int i = x; i <= x2; i++) {
if(grid[i][y2] != grid[x][y]) {
ok = false;
}else vis[i][y2] = true;
}
for(int i = y; i <= y2; i++) {
if(grid[x][i] != grid[x][y]) {
ok = false;
}else vis[x][i] = true;
}
for(int i = y; i <= y2; i++) {
if(grid[x2][i] != grid[x][y]) {
ok = false;
}else vis[x2][i] = true;
}
for(int i = x+1; i < x2; i++) {
for(int j = y+1; j < y2; j++) {
if(grid[i][j] != '.') ok = false;
}
}
return ok;
}
int main() {
while(scanf("%d%d", &n, &m) != EOF && (n || m)) {
init();
for(int i = 0; i < n; i++) {
scanf("%s", grid[i]);
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
if(!vis[i][j] && isalpha(grid[i][j])) {
if(check(i, j))
vec.push_back(grid[i][j]);
}
}
}
sort(vec.begin(), vec.end());
for(int i = 0; i < vec.size(); i++) {
printf("%c", vec[i]);
}puts("");
}
return 0;
}