问题描述:
Tom有一块草坪,分成N*M个区域,有修剪过的草坪和未修剪过的草坪。求TOM的草坪漂不漂亮。
漂亮的条件:
①草坪不能全为未修剪过的草坪。
②相邻草坪不能同为修剪过的草坪。
解题思路:
本题关键点在于统计0的个数以及搜索是否存在纵向和横向两个方向之一存在连续0的情况。
把两个要求写成两个函数,最终判断时在进行调用,节省时间,简化程序代码。
用二维数组来记录草坪的情况。
解题心得:
本题题意简单,思路清晰,但是细节问题较多,需要进行多次修改,注意题中细节处理。
#include <iostream>
#define MAX 12
using namespace std;
int map[MAX][MAX];
int a[4][2]= {{0,1},{0,-1},{1,0},{-1,0}};
int n,m,sum,mark;
bool B(int x,int y)
{return (x>=0&&y>=0&&x<n&&y<m);
}
void D()
{
int i,j,ti,tj,k;
for(i=0; i<n; i++)
for(j=0; j<m; j++)
{ if(map[i][j]==1)
{sum++;
continue;
}
for (k=0; k<4; k++)
{
ti=i+a[k][0];
tj=j+a[k][1];
if(B(ti,tj))
{
if(map[ti][tj]==0)
{
mark=1;
return ;
}
}
}
}
}
int main()
{
while (cin>>n>>m)
{ if(n==0&&m==0)
break;
int i,j;
for(i=0; i<n; i++)
for(j=0; j<m; j++)
cin>>map[i][j];
mark=0;
sum=0;
D();
if(mark==1||sum==m*n)
cout<<"No"<<endl;
else
cout<<"Yes"<<endl;
}
return 0;
}
#define MAX 12
using namespace std;
int map[MAX][MAX];
int a[4][2]= {{0,1},{0,-1},{1,0},{-1,0}};
int n,m,sum,mark;
bool B(int x,int y)
{return (x>=0&&y>=0&&x<n&&y<m);
}
void D()
{
int i,j,ti,tj,k;
for(i=0; i<n; i++)
for(j=0; j<m; j++)
{ if(map[i][j]==1)
{sum++;
continue;
}
for (k=0; k<4; k++)
{
ti=i+a[k][0];
tj=j+a[k][1];
if(B(ti,tj))
{
if(map[ti][tj]==0)
{
mark=1;
return ;
}
}
}
}
}
int main()
{
while (cin>>n>>m)
{ if(n==0&&m==0)
break;
int i,j;
for(i=0; i<n; i++)
for(j=0; j<m; j++)
cin>>map[i][j];
mark=0;
sum=0;
D();
if(mark==1||sum==m*n)
cout<<"No"<<endl;
else
cout<<"Yes"<<endl;
}
return 0;
}