题目描述
花园里有一块草坪,现将它分成M*N的方块。判断这块草坪是否漂亮有两条规则:
1.不是所有方块都长着草,但必须有方块长草;
2.没有一个独立的长着草的方块,即必须相邻的长有草的方块数至少为2。
输入要求
第一行为两个整数M和N( 0 < M , N < = 10 ),分别表示划分后的行与列;
接下来M行,每行N个数,用空格隔开。1表示该方块长着草,0表示没长草。
输出要求
如果这块草坪是漂亮的,输出“Yes”,否则输出“No”。
输入样例
6 5
0 0 1 0 0
0 0 1 0 0
1 1 1 1 1
0 0 1 0 0
1 0 0 0 0
1 0 0 0 0
输出样例
Yes
#include <stdio.h>
int main(){
int i, j, m, n, s[100][10], num = 0;
scanf("%d%d", &m, &n);
for(i = 0; i < m; i++){
for(j = 0; j < n; j++){
scanf("%d", &s[i][j]);
if(s[i][j] == 1)
num++;
}
}
if(num == n*m){
printf("No\n");
return 0;
}else if(num == 0){
printf("No\n");
return 0;
}
for(i=1;i<m-1;i++){
for(j=1;j<n-1;j++){
if(s[i][j]==1){
if(s[i+1][j] ==1 || s[i-1][j] ==1 || s[i][j-1] ==1 || s[i][j+1] == 1);
else{
printf("No\n");
return 0;
}
}
}
}
if(s[0][0] == 1){
if(s[1][0] == 1 || s[0][1] == 1);
else{
printf("No\n");
return 0;
}
}
if(s[0][n - 1] == 1){
if(s[1][n - 1] == 1 || s[0][n - 2] == 1);
else{
printf("No\n");
return 0;
}
}
if(s[m - 1][0] == 1){
if(s[m - 2][0] == 1 || s[m - 1][1] == 1);
else{
printf("No\n");
return 0;
}
}
if(s[m - 1][n - 1] == 1){
if(s[m-1][n-2] ==1 || s[m-2][n-1]==1);
else{
printf("No\n");
return 0;
}
}
for(j = 1; j < n - 1; j++){
if(s[0][j] == 1){
if(s[0][j - 1] ==1 || s[0][j + 1] ==1 || s[1][j] == 1);
else{
printf("No\n");
return 0;
}
}
}
for(j = 1; j < n - 1; j++){
if(s[m - 1][j] == 1){
if(s[m - 1][j - 1] ==1 || s[m - 1][j + 1] ==1 || s[m - 2][j] == 1);
else{
printf("No\n");
return 0;
}
}
}
for(i = 1; i < m - 1; i++){
if(s[i][0] == 1){
if(s[i - 1][0] ==1 || s[i + 1][0] ==1 || s[i][1] == 1);
else{
printf("No\n");
return 0;
}
}
}
for(i = 1; i < m - 1; i++){
if(s[i][n - 1] == 1){
if(s[i - 1][n - 1] ==1 || s[i + 1][n - 1] ==1 || s[i][n - 2] == 1);
else{
printf("No\n");
return 0;
}
}
}
printf("Yes\n");
return 0;
}