zoukankan      html  css  js  c++  java
  • HDU 1198

    此题是搜索入门题目。以某一点为中心,向四个方向搜索。搜过的做好标记,将不再搜。每个点遍历一次,当搜索完一次,代表连通分支又多一个。最后得到的连通分支数就是我们所要求的。

    以下是代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    //上下左右的顺序定义数组0,1,2,3
    char a[12][4]={{1,0,1,0},{1,0,0,1},{0,1,1,0},
    {0,1,0,1},{1,1,0,0},{0,0,1,1},{1,0,1,1},{1,1,1,0},
    {0,1,1,1},{1,1,0,1},{1,1,1,1}};
    int f[3000];
    int sign,m,n,sum;
    char s[51][51];

    void mysearch(int i)
    {

    if(!f[i]){
    if(!sign) {sign=1;sum++;}
    //sign=0等于0,说明再一次开始搜
    f[i]=1;
    int x=i/n,y=i%n;
    if(x-1>=0&&!f[i-n]&&a[s[x][y]-65][0] &&a[s[x-1][y]-65][1])
    mysearch(i-n);
    //向上搜
    if(x+1<m&&!f[i+n]&&a[s[x][y]-65][1] &&a[s[x+1][y]-65][0])
    mysearch(i+n);
    //向下
    if(y-1>=0&&!f[i-1]&&a[s[x][y]-65][2] &&a[s[x][y-1]-65][3])
    mysearch(i-1);
    //向左
    if(y+1<n&&!f[i+1]&&a[s[x][y]-65][3] &&a[s[x][y+1]-65][2])
    mysearch(i+1);
    //向右
    }
    }
    int main()
    {
    int i;
    while(cin>>m>>n){
    if(m==-1&&n==-1) break;
    sum=0;
    for(i=0;i<m;i++)
    scanf("%s",s[i]);
    for(i=0;i<m*n;i++){
    sign = 0;
    mysearch(i);
    }
    cout<<sum<<endl;
    memset(f,0,sizeof f);
    }
    return 0;
    }

  • 相关阅读:
    SDOI2011古代朱文
    LIS 堆优化
    ZR2019 广州 游记
    LG2709 小B的询问
    [SCOI2009] 生日礼物
    [SDOI2008]沙拉公主的困惑
    [LG3396]哈希冲突
    ZROI2018.8.2 菜鸡互啄杯组队 ACM 赛
    ZROI 菜鸡互啄杯 III
    [LG4016] 负载平衡问题
  • 原文地址:https://www.cnblogs.com/Potato-lover/p/3691586.html
Copyright © 2011-2022 走看看