• hdu1198(模拟搜索)


    这个题目,比较恶心,思路很是简单,就是模拟的时候有些麻烦......水题

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    char s[100][100];
    int t[400][400],vist[400][400];
    int n,m;
    int p[13][3][3]={
        {
            0,1,0,
            1,1,0,
            0,0,0
        },
    
        {
            0,1,0,
            0,1,1,
            0,0,0,
        },
    
        {
            0,0,0,
            1,1,0,
            0,1,0,
        },
    
        {
            0,0,0,
            0,1,1,
            0,1,0,
        },
    
        {
            0,1,0,
            0,1,0,
            0,1,0,
        },
    
        {
            0,0,0,
            1,1,1,
            0,0,0,
        },
    
        {
            0,1,0,
            1,1,1,
            0,0,0,
        },
    
        {
            0,1,0,
            1,1,0,
            0,1,0,
        },
    
        {
            0,0,0,
            1,1,1,
            0,1,0,
        },
    
        {
            0,1,0,
            0,1,1,
            0,1,0,
        },
    
        {
            0,1,0,
            1,1,1,
            0,1,0,
        }
    };
    int fx[4][2]={1,0,-1,0,0,1,0,-1};
    void dfs(int x,int y)
    {
        for(int i=0;i<4;i++)
        {
            int mx=fx[i][0]+x;
            int my=fx[i][1]+y;
            if(0<=mx&&mx<3*n&&my>=0&&my<3*m&&!vist[mx][my]&&t[mx][my]==1)
            {
                vist[mx][my]=1;
                dfs(mx,my);
            }
        }
    }
    int main()
    {
    
        while(scanf("%d%d",&n,&m)>0)
        {
            if(n==-1&&m==-1)   break;
            for(int i=0;i<n;i++)
            scanf("%s",s[i]);
            int cnt=0;
            memset(t,0,sizeof(t));
            memset(vist,0,sizeof(vist));
            for(int i=1;i<3*n;i+=3)
            {
                //if(i%2==0)
                //continue;
                for(int j=1;j<3*m;j+=3)
                {
                    //if(j%2==0)
                    //continue;
                    int tmp=i-1;
                    int tmp1=j-1;
                    int hang=cnt/m;
                    int lie=cnt%m;
                    int x=s[hang][lie]-'A';
                    cnt++;
                    for(int r=tmp;r<=i+1;r++)
                    for(int ll=tmp1;ll<=j+1;ll++)
                    {
                        if(t[r][ll]==0)
                        t[r][ll]=p[x][r-tmp][ll-tmp1];
                    }
                }
            }
            /*for(int i=0;i<3*n;i++)
            {
                for(int j=0;j<3*m;j++)
                printf("%d",t[i][j]);
                printf("
    ");
            }*/
            int sum=0;
            for(int i=1;i<3*n;i+=3)
            {
                for(int j=1;j<3*m;j+=3)
                {
                    if(!vist[i][j]&&t[i][j]==1)
                    {
                        dfs(i,j);
                        sum++;
                    }
                }
            }
            printf("%d
    ",sum);
        }
        return 0;
    }
    
  • 相关阅读:
    JavasScript 实现二分法快排注意点
    JS的面向对象二(通过构造函数的方式)
    JS的面向对象一(通过构造函数的方式)
    leetcode.977_有序数组的平方
    leetcode_38.报数
    leetcode_20.c++有效的括号
    leetcode_21.c++合并两个有序列表
    leetcode_最长公共前缀
    T2_两数相加
    T1_两数之和
  • 原文地址:https://www.cnblogs.com/ziyi--caolu/p/3476802.html
Copyright © 2020-2023  润新知