题目截图:
题目大意:
给定一个n行m列的01图,判断图中的”1“连通块是否都为矩形。
思路:
题主做法(稍复杂):bfs每一个连通块,取到连通块中的所有点的横纵坐标,记录最大横纵坐标和最小横纵坐标,圈出”标准矩形“,若连通块中点的数量与“标准矩形的数量相同,那么这个连通块是矩形。
题主在实现中出现的问题:在bfs时没有考虑向上向左遍历点的情况。
大佬做法:遍历图中每一个”0“点,若它所在2 * 2 方格中有 3 个 ”1“点, 那么图中就存在不是矩形的连通块。
题主思路AC代码:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
int T, n, m;
bool st[110][110];//有没有被遍历过
char mmp[110][110];
int dx[4] = {0, 1, -1, 0}, dy[4] = {1, 0, 0, -1};
int bbfs(int x, int y)//统计遍历过的1的数量,并将遍历过的1 st 变为true ,坐标存在中找最大边界
{
int sum = 0;
int maxr = 0, maxc = 0;
int minr = 0x3f3f3f3f, minc = 0x3f3f3f3f;
queue<pair<int, int>> q;
q.push({x, y}), st[x][y] = true, maxr = max(maxr, x), maxc = max(maxc, y), minr = min(minr, x), minc = min(minc, y), sum ++ ;
while(q.size())
{
auto t = q.front();
q.pop();
for(int i = 0; i < 4; i ++ )
{
int xx = t.first + dx[i], yy = t.second + dy[i];
if(mmp[xx][yy] == '1' && !st[xx][yy] && xx <= n && yy <= m)
{
q.push({xx, yy}), st[xx][yy] = true, maxr = max(maxr, xx), maxc = max(maxc, yy), minr = min(minr, xx), minc = min(minc, yy), sum ++ ;
}
}
}
int temp = (maxr - minr + 1) * (maxc - minc + 1);
if(temp != sum) return true;
else return false;
}
int main()
{
cin >> T;
while(T -- )
{
memset(st, 0, sizeof st);
cin >> n >> m;
for(int i = 1; i <= n; i ++ )
for(int j = 1; j <= m; j ++ )
cin >> mmp[i][j];
int flag = 0;
for(int i = 1; i <= n; i ++ )
{
for(int j = 1; j <= m; j ++ )
{
if(mmp[i][j] == '1' && !st[i][j])
{
flag = bbfs(i, j);//有问题返回1, 没问题返回0
if(flag) break;
}
}
if(flag) break;
}
if(flag) cout << "NO" << endl;
else cout << "YES" << endl;
}
system("pause");
return 0;
}
大佬代码:
#include <iostream>
#include <cstring>
using namespace std;
typedef long long ll;
const int N = 110;
string s[N];
int main(){
ios::sync_with_stdio(false); cin.tie(0), cout.tie(0);
int t;
cin >> t;
while (t -- ){
int n, m;
cin >> n >> m;
for (int i = 0; i < n; i ++ ) cin >> s[i];
int flag = 1;
for (int i = 0; i < n - 1; i ++ ){
for (int j = 0; j < m - 1; j ++ ){
int cnt = s[i][j] - '0' + s[i][j + 1] - '0' + s[i + 1][j] - '0' + s[i + 1][j + 1] - '0';
if (cnt == 3) flag = 0;
}
}
if (flag) cout << "YES" << endl;
else cout << "NO" << endl;
}
system("pause");
return 0;
}
(ps:瞎写个对拍,还挺好玩hhhhh,妈妈再也不用担心WA题没数据了)