热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【2017"百度之星"程序设计大赛-初赛(A)】度度熊的01世界

【链接】http:bestcoder.hdu.edu.cncontestscontest_showproblem.php?cid775&pid1006【题意】在这里写题意【题解】先
【链接】http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=775&pid=1006
【题意】
在这里写题意

【题解】
先找出最外围的0,把那些0都去掉. 从(0,0)开始广搜,这样就能把整个外围都去掉了; (注意要把这些0去掉) (图是存在(1,1)~(n,m)里面的) 然后找(1,1)~(n,m)里面的1的联通块个数. 再找0的联通块个数.(在去掉外围的0之后) (这个时候0只能是1联通块里面的联通块了.或者干脆就找不到了) 然后看看1的联通块个数是不是1,是1的话,看0的联通块个数; 个数为0的话,就是0,否则是1.
【错的次数】
0
【反思】
在这了写反思
【代码】
#include 
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ms(x,y) memset(x,y,sizeof x)
#define ri(x) scanf("%d",&x)
#define rl(x) scanf("%lld",&x)
#define rs(x) scanf("%s",x+1)
#define oi(x) printf("%d",x)
#define ol(x) printf("%lld",x)
#define oc putchar(' ')
#define os(x) printf(x)
#define all(x) x.begin(),x.end()
#define Open() freopen("F:\\rush.txt","r",stdin)
#define Close() ios::sync_with_stdio(0)


typedef pair pii;
typedef pair pll;


const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int N = 110;


int n,m;
char s[N][N];
bool vis[N][N];
queue dl;






int main(){
    //Open();
    //Close();
    while (~ri(n)){
        ms(vis,0);
        ri(m);
        rep1(i,1,n) rs(s[i]);


        dl.push(mp(0,0));
        while (!dl.empty()){
            int x = dl.front().first,y = dl.front().second;
            dl.pop();
            rep1(i,1,4){
                int tx = x + dx[i],ty = y + dy[i];
                if (tx >= 0 && tx <= n+1 && ty >= 0 && ty <= m+1){
                    if (!vis[tx][ty]){
                        if (tx >=1 && tx <= n && ty >= 1 && ty <= m)
                            if (s[tx][ty]=='1') continue;
                        vis[tx][ty] = 1;
                        dl.push(mp(tx,ty));
                    }
                }
            }
        }
        //return 0;


        int nei1 = 0;
        rep1(i,1,n)
            rep1(j,1,m)
                if (s[i][j]=='1' && !vis[i][j]){
                    nei1++;
                    vis[i][j] = 1;
                    dl.push(mp(i,j));
                    while (!dl.empty()){
                        int x = dl.front().first,y = dl.front().second;
                        dl.pop();
                        rep1(i,1,4){
                            int tx = x + dx[i],ty = y + dy[i];
                            if (tx >= 1 && tx <= n && ty >= 1 && ty <= m){
                                if (s[tx][ty]=='1' && !vis[tx][ty]){
                                    vis[tx][ty] = 1;
                                    dl.push(mp(tx,ty));
                                }
                            }
                        }
                    }
                }


        if (nei1==0 || nei1 > 1){
            puts("-1");
            continue;
        }


        int nei0 = 0;
        rep1(i,1,n)
            rep1(j,1,m)
                if (s[i][j]=='0' && !vis[i][j]){
                    nei0++;
                    vis[i][j] = 1;
                    dl.push(mp(i,j));
                    while (!dl.empty()){
                        int x = dl.front().first,y = dl.front().second;
                        dl.pop();
                        rep1(i,1,4){
                            int tx = x + dx[i],ty = y + dy[i];
                            if (tx >= 1 && tx <= n && ty >= 1 && ty <= m){
                                if (s[tx][ty]=='0' && !vis[tx][ty]){
                                    vis[tx][ty] = 1;
                                    dl.push(mp(tx,ty));
                                }
                            }
                        }
                    }
                }


        if (nei1 == 1 && nei0 == 1){
            puts("0");
            continue;
        }
        if (nei1 == 1 && nei0 == 0){
            puts("1");
            continue;
        }
        puts("-1");
    }
    return 0;
}



推荐阅读
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了最长上升子序列问题的一个变种解法,通过记录拐点的位置,将问题拆分为左右两个LIS问题。详细讲解了算法的实现过程,并给出了相应的代码。 ... [详细]
author-avatar
mobiledu2502875393
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有