链接
解题思路
把左上角和右下角的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;
} 


京公网安备 11010502036488号