zoukankan      html  css  js  c++  java
  • Codeforces Round #514 (Div. 2) B

    这个题我一开始没思路,最后也没思路

    2个小时一直没思路

    本来还想解释题意的,写了半天发现解释的不是很清楚,你还是google翻译一下吧

    这个题解法是这样的:

    首先,给你图案里面有很多的点,每个点的周围8个点都不可能在上面落笔,因为你一旦在周围8个点落笔,必定会覆盖掉这个点,

    其次,每一个有#的地方,他周围8个点一定有一个地方能够落笔

    所以我们把所有不可能落笔的点都记录下来,再判断每一个#的地方,假设周围有能落笔的地方,说明可以画

    只要找到一个#周围没有可以落笔的地方,输出no

    (  笔不能超过纸张,也就是说落笔范围在(1,1)(n-2,m-2)这个矩形里面)

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 1e3+5;
    char arr[maxn][maxn];
    bool vis[maxn][maxn];
    int n,m;
    void painw(int x,int y)
    {
        vis[x+1][y] = vis[x+1][y-1] = vis[x+1][y+1] = vis[x-1][y] = vis[x-1][y-1] = vis[x-1][y+1] = false;
        vis[x][y+1] = vis[x][y-1] = false;
    }
    bool pan(int x,int y)
    {
        bool f = false;
        for(int i = -1;i <= 1;++i)
        {
            for(int j = -1; j <= 1; ++j)
            {
                //cout << x+i << " " << y+j << endl;
                if(x+i <= 1 || x+i >= n || y+j <= 1 || y+j >= m)
                    continue;
                if(i == 0 && j == 0)
                    continue;
                if(vis[x+i][y+j] == true)
                    f = true;
            }
        }
        //cout << f << endl;
        return f;
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        int cnt = 0;
        memset(vis,true,sizeof(vis));
        for(int i = 1; i <= n; ++i)
        {
            getchar();
            for(int j = 1; j <= m; ++j)
            {
                scanf("%c",arr[i]+j);
                if(arr[i][j] == '.')
                    painw(i,j);
            }
        }
        for(int i = 0; i <= m+1; ++i)
            vis[0][i] = vis[n+1][i] = false;
        for(int i = 0; i <= n+1; ++i)
            vis[i][0] = vis[i][m+1] = false;
    
    
        /*for(int i = 0; i <=n+1; ++i)
        {
            for(int j = 0; j <= m+1; ++j)
                printf("%d",vis[i][j]);
            printf("
    ");
        }*/
    
    
    
        for(int i = 1; i <= n; ++i)
        {
            for(int j = 1; j <= m; ++j)
            {
                if(arr[i][j] == '#' && pan(i,j) == false)
                {
                    printf("NO
    ");
                    return 0;
                }
            }
        }
        printf("YES
    ");
        return 0;
    }
  • 相关阅读:
    Windows Server 2008 R2系统上安装SQLServer2012集群(简略)
    播放视频有沙沙的杂音怎么处理?
    合并两个表取数
    电脑下边的语言栏跑到左边了怎么办?
    一条SQL查出当月的每一天
    统一本地服务器名和计算机名
    一个奇葩的SQL
    Cent Os7.0安装MongoDB4.2.0
    MySQL 8.0.5开启远程连接
    MySQL系统函数及SQL开发中易犯错的点
  • 原文地址:https://www.cnblogs.com/mltang/p/9748483.html
Copyright © 2011-2022 走看看