1.简单描述
一个m*n的矩阵,若满足条件:不是所有方块上都长着草;两块剪去草的方块不能相连。则该矩阵为漂亮矩阵,可多次测试该矩阵是否为漂亮矩阵。
2.思路
不漂亮的情况:全为1;上下左右两个相邻元素为0 0。
最开始写的程序
#include<iostream>
using namespace std;
int main()
{
int a[10][10];
int n,m;
while(cin>>n>>m)
{
if(n==0&&m==0)break;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
cin>>a[i][j];
}
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
if(a[i][j]==a[i][j+1]||a[i][j]==a[i+1][j])
cout<<"No"<<endl;
else
cout<<"Yes"<<endl;
}
}
return 0;
}
有两个问题所有草坪上的草都没有除的情况无法表示 if(a[i][j]==a[i][j+1]||a[i][j]==a[i+1][j])cout<<"No"<<endl;并未包含所有的“No”情况。
应用flag会避免这种情况,尝试理解了一下答案。
#include<iostream>
using namespace std;
int main()
{
int p[10][10];
int n,m;
int i,j,k;
int flag=1;
while(cin>>n>>m)
{
if(n==0&&m==0)break;
flag=1;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
cin>>p[i][j];
if(p[i][j]==0)flag=0;
}
}
if(flag==1)
{
cout<<"No"<<endl;
continue;
}
for(k=1;k<m;k++)
{
if(p[0][k]==0&&p[0][k-1]==0)
{
cout<<"No"<<endl;
goto RL;
}
}
for(i=1;i<n;i++)
{
for(j=0;j<m;j++)
{
if(p[i][j]==0&&p[i-1][j]==0)
{
cout<<"No"<<endl;
goto RL;
}
if(j!=0)
{
if(p[i][j]==0&&p[i][j-1])
{
cout<<"No"<<endl;
goto RL;
}
}
}
}
cout<<"Yes"<<endl;
continue;
RL:
continue;
}
return 0;
}//用goto 破坏了结构。
# include <iostream>
using namespace std;
int main()
{
int n, m;
int mp[11][11];
while(cin >> n >> m)
{
if(n == 0 && m == 0)
break;
int flag = 0, ok = 1;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
{
cin >> mp[i][j];
if(j >= 2 && mp[i][j-1] == 0 && mp[i][j] == 0) // zuo
ok = 0;
if(i >= 2 && mp[i-1][j] == 0 && mp[i][j] == 0) // shang
ok = 0;
if(mp[i][j] == 0)
flag = 1;
}
if(flag && ok)
cout << "Yes" << endl;
else
cout << "No" << endl;
}
return 0;
}
3.体会
如果一道题里的循环和条件语句多的话,一般就迷糊了,可能是逻辑思维的能力太差。