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("\n");

        }*/

        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\n",sum);

    }

    return 0;

}

 

你可能感兴趣的:(HDU)