ZOJ 3944 People Counting(思维/技巧/模拟)

题目:http://www.icpc.moe/onlinejudge/showProblem.do?problemCode=3944

代码:

#include<stdio.h>
#include<string.h>

using namespace std;

char maps[105][105];
char base[105][105]= {{'.','O','.'},{'/','|','\\'},{'(','.',')'}};

int h,w;

int judge(int x,int y) //起点
{
    /*for(int i=0;i<3;i++)
    {
        for(int j=0;j<3;j++)
        {
            printf("%c",base[i][j]);
        }
        printf("\n");
    }*/

    for(int i=0; i<3; i++)
    {
        for(int j=0; j<3; j++)
        {
            if(base[i][j]==maps[i+x-2][j+y-2]&&base[i][j]!='.')
            {
                //printf("%d %d %c %c %d %d %d %d\n",x,y,base[i][j],maps[i+x-2][j+y-2],i,j,i+x-2,j+y-2);
                return 1;
            }
        }
    }
    return 0;
}
int main()
{
    int t;
    scanf("%d",&t);

    while(t--)
    {
        scanf("%d%d\n",&h,&w);

        memset(maps,'#',sizeof(maps));

        for(int i=2; i<h+2; i++)
        {
            for(int j=2; j<w+2; j++)
            {
                scanf("%1c",&maps[i][j]);
            }
            getchar();
        }

        /*for(int i=0; i<h+4; i++)
        {
            for(int j=0; j<w+4; j++)
            {
                printf("%c",maps[i][j]);
            }
            printf("\n");
        }*/

        int ans=0;

        for(int i=2; i<=w+4; i++)
        {
            for(int j=2; j<=h+4; j++)
            {
                if(judge(i,j))
                {
                    //printf("%d %d\n",i,j);
                    ans++;
                }
            }
        }
        printf("%d\n",ans);
    }
}


先把图扩大为

#######

#######

##~~~##

##~~~##

##~~~##

#######

#######

格式。

每次查找以一个点位基础,看能否出现一个小人。

第一次为

###

###

##~

第二次为

###

###

#~~

只要有一个字符 与 基础图型的对应位置 相同就说明 该位置一定有一个人。

经过大神的指点思路,改了好多次,竟然一发A了。

我写的代码我自己都没看懂。

你可能感兴趣的:(ZOJ 3944 People Counting(思维/技巧/模拟))