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;
    }

  • 相关阅读:
    净化-湿式除尘器:湿式除尘器
    净化-袋式除尘器:袋式除尘器
    LOCK
    locale
    loadkeys
    LOAD
    ln -在文件之间建立连接
    lmhosts
    listen
    listalias
  • 原文地址:https://www.cnblogs.com/Potato-lover/p/3691586.html
Copyright © 2011-2022 走看看