题解 P7550 [COCI2020-2021#6] Bold

· · 题解

Solution P7550 [COCI2020-2021#6] Bold

一、思路:

这道题还是很简单的······

读题可得:如果点(i,j)为"#",那么点(i,j+1),点(i+1,j),点(i+1,j+1)都将变为"#"。

输入自然很简单,普通用cincout就可以读入/输出。

    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>a[i][j];
        }
    }

要注意的是:

每个点更新的时候我们不能从i+1,j+1方向更新,这样更新的点会被扫到错误答案,例如:

....

.#..

....

....

当我们更新(2,2)时,(2,3)(3,2)(3,3)都会被更新。(如下图)

....

.##.

.##.

....

但是我们在更新(2,3)时就会发现这个点已经被更新,所以(2,4)(3,3)(3,4)也会被更新,以此类推。(如下图)

....

.###

.###

.###

但是我们是不能更新这几个点的,因为题目中的(2,3)不是"#"。会导致程序错误。

那我们怎样更新呢?我们可以从i-1,j-1的方向更新,这样是不会出问题的。

    for(int i=n;i>0;i--){
        for(int j=m;j>0;j--){
            if(a[i][j]=='#'){
                a[i][j+1]='#';
                a[i+1][j]='#';
                a[i+1][j+1]='#';
            }
        }
    }

然后再输出就行了。

二、参考代码:

#include<bits/stdc++.h>
using namespace std;
char a[1005][1005];
int n,m;
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>a[i][j];
        }
    }
    for(int i=n;i>0;i--){
        for(int j=m;j>0;j--){
            if(a[i][j]=='#'){
                a[i][j+1]='#';
                a[i+1][j]='#';
                a[i+1][j+1]='#';
            }
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cout<<a[i][j];
        }
        cout<<endl;
    }
    return 0;
}

三、尾声:

这部分看起来根本没用

这道题的满分是50,所以就会出现Accepted 50的情况······

感谢大家对我的支持,感谢您的浏览,希望能帮助到您,祝您早日犇犇。

                By  Indifferent