《ACM程序设计》书中题目W 第二十三题 漂亮的草坪

来源:互联网 发布:上网监控软件下载 编辑:程序博客网 时间:2024/05/18 14:11

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.体会

如果一道题里的循环和条件语句多的话,一般就迷糊了,可能是逻辑思维的能力太差。



0 0
原创粉丝点击