zoukankan      html  css  js  c++  java
  • Codeforces 1015 E(模拟)

    传送门E1

    传送门E2

    题目描述:

        给你一张n*m的图,星星的概念是若一个点为‘*’,如果它的上下左右一格,两格.....n格都是‘*’,那么它就是一个星星。题目问你给你的这张图是否能够完全呗星星给覆盖,如果可以,则输出每个星星的中心点和延申的大小,否则输出-1。

        E1的数据范围n,m<=100,而E2的数据范围n,m<=1000

    题目分析:

        事实上两个题的做法基本上是一样的,我们只需要对每个‘*’的位置暴力的扩展四个方向,找到每个‘*’可以拓展出的最大的星星,并将其存进答案即可。而题目问的是是否能够用星星完全覆盖整张图,我们可以在上述扩展的过程中,如果能够合法的扩展,就将合法位置打上标记,最后遍历整张图判断下是否有没有打上标记的‘*’即可,如果有就直接输出-1。

        而这个题有一个坑点,就是倘若整张图都没有‘*’,答案应该是0而不是-1,这种情况特判一下即可。

        E1,E2就改一改数据范围即可。

    代码:

    #include <bits/stdc++.h>
    #define maxnE1 105
    #define maxnE2 1005
    using namespace std;
    struct node{
        int x,y;
        int sz;
        node(){}
        node(int _x,int _y,int _sz){
            x=_x,y=_y,sz=_sz;
        }
    }q[maxnE1];
    vector<node>res;//存储答案
    int n,m;
    bool vis[maxnE1][maxnE1];
    char str[maxnE1][maxnE1];
    bool aha=0;//为0则证明没有出现过'*'
    
    bool judge(int x,int y,int sz){//暴力扩展四个方向
        int up=x-sz,down=x+sz,left=y-sz,right=y+sz;
        if(up<0||down>n||left<0||right>m) return false;
        if(str[up][y]=='*'&&str[down][y]=='*'&&str[x][left]=='*'&&str[x][right]=='*'){
            vis[up][y]=1,vis[down][y]=1,vis[x][left]=1,vis[x][right]=1;
            return true;
        }
        return false;
    }
    
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=0;i<n;i++){
            scanf("%s",str[i]);
        }
        for(int i=1;i<n-1;i++){
            for(int j=1;j<m-1;j++){
                int cnt=0;
                if(str[i][j]=='*'){
                    aha=1;
                    bool flag=false;
                    while(judge(i,j,++cnt)){//不断向四周拓展
                        flag=true;
                        vis[i][j]=1;
                    }
                    if(flag) res.push_back(node(i,j,cnt-1));
                }
            }
        }
        if(res.size()==0&&aha){
            puts("-1");
            return 0;
        }
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(str[i][j]=='*'&&!vis[i][j]){
                    puts("-1");
                    return 0;
                }
            }
        }
        cout<<res.size()<<endl;
        int len=res.size();
        for(int i=0;i<len;i++){
            printf("%d %d %d
    ",res[i].x+1,res[i].y+1,res[i].sz);
        }
        return 0;
    }
    
  • 相关阅读:
    Android Init语言
    Android Framework------之Input子系统
    Android Framework------之Keyguard 简单分析
    Android Framework------之ActivityManagerService与Activity之间的通信
    Android Framework------之PowerManagerService的功能
    蓝牙广播数据格式和动态改变
    蓝牙DA14580开发:固件格式、二次引导和烧写
    嵌入式调试器原理和各类调试器集锦(JLINK、STLINK、CCDEBUG)
    微信智能跑鞋技术解密
    国内物联网平台的发展、技术架构演进暨物联网解决方案发布
  • 原文地址:https://www.cnblogs.com/Chen-Jr/p/11007246.html
Copyright © 2011-2022 走看看