深搜(DFS),Image Perimeters

题目链接:http://poj.org/problem?id=1111

解题报告:

1、这里深搜有一点要注意,对角线上的点,如果为'.',则total不应该增加,因为这不是他的边长。

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

char maps[35][35];
int flag[35][35];
int mov1[4][2]= {{1,0},{-1,0},{0,1},{0,-1}};
int mov2[4][2]= {{1,1},{1,-1},{-1,1},{-1,-1}};
int r,c;
int click_x,click_y;
int total;///周长


void dfs(int x,int y)
{
    if(flag[x][y]!=0) return ;
    else
    {
        flag[x][y]=1;
        int tx;
        int ty;
        for(int k=0; k<4; k++)
        {
            tx=x+mov1[k][0];
            ty=y+mov1[k][1];

            if(maps[tx][ty]=='X'&&flag[tx][ty]==0)
                dfs(tx,ty);
            else if(maps[tx][ty]=='.')
                total++;

        }
        for(int k=0; k<4; k++)
        {
            tx=x+mov2[k][0];
            ty=y+mov2[k][1];
            if(maps[tx][ty]=='X'&&flag[tx][ty]==0)
                dfs(tx,ty);
        }
    }
}


int main()
{
    while(scanf("%d%d%d%d",&r,&c,&click_x,&click_y),r)
    {
        total=0;
        memset(flag,0,sizeof(flag));
        memset(maps,'.',sizeof(maps));
        for(int i=1; i<=r; i++)
        {
            scanf("%s",maps[i]+1);
            maps[i][c+1]='.';
        }
        dfs(click_x,click_y);
        printf("%d\n",total);
    }
    return 0;
}

 

你可能感兴趣的:(深搜(DFS),Image Perimeters)