2019牛客国庆集训派对 全 1 子矩阵 解题报告
全 1 子矩阵
https://ac.nowcoder.com/acm/contest/1099/A
链接
解题思路
把左上角和右下角的1
找到,中间必须全部填满1
,否则就不是bobo矩阵。
+-------------------+ | 开始 | +---------+---------+ | | v +-------------------+ | 找到最左上角的1 | +-------------------+ | | v +-------------------+ | 找到最右下角的1 | +-------------------+ | | v XXXXX XX X XXXX XXXX XXX XX XXXX 否 XXXX XXXX XX 中间是不是全是1 +----------------------+ XXX X X | XXXXX X X | XXXX XXXX | XXXX XXXX | XXXXX | + | | 是 | | | | | | | v v +----------------------+ +-----------------------+ | | | | | 输出"Yes" | | 输出"No" | | | | | +----------------------+ +-----------------------+ | | | | | | | | | | | | |<----------------------------------+ | | | v +----------------------+ | 结束 | +----------------------+
源代码
#include <cstdio> #include <cstring> #include <climits> #include <utility> using namespace std; #define MAX_LENGTH 15 typedef pair<int, int> COOR; bool is_bobo_mat(int n, int m, char A[MAX_LENGTH][MAX_LENGTH]) { COOR upper_leftest_one = make_pair(INT_MAX, INT_MAX); COOR lower_rightest_one = make_pair(INT_MIN, INT_MIN); bool found_one = false; for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { if (A[i][j] == '1') { found_one = true; if (i < upper_leftest_one.first) upper_leftest_one.first = i; if (j < upper_leftest_one.second) upper_leftest_one.second = j; if (i > lower_rightest_one.first) lower_rightest_one.first = i; if (j > lower_rightest_one.second) lower_rightest_one.second = j; } } } if (!found_one) return false; for (int i = upper_leftest_one.first; i <= lower_rightest_one.first; ++i) { for (int j = upper_leftest_one.second; j <= lower_rightest_one.second; ++j) { if (A[i][j] == '0') return false; } } return true; } int main() { int n, m; char A[MAX_LENGTH][MAX_LENGTH]; while (scanf("%d%d", &n, &m) != EOF) { memset(A, 0, sizeof(A)); for (int j = 0; j < n; ++j) scanf("%s", A[j]); if (is_bobo_mat(n, m, A)) puts("Yes"); else puts("No"); } return 0; }