POJ 1111 Image Perimeters

来源:互联网 发布:盐城seo 编辑:程序博客网 时间:2024/06/05 06:18


http://poj.org/problem?id=1111

搜索一个连通块并求其周长

#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>using namespace std;const int N = 25;char map[N][N];int ans[N][N];int move[][2] = {{-1,0},{1,0},{0,-1},{0,1}};int m,n;bool IsIn(int x, int y){    if(x < 0 || x >= m || y < 0 || y >= n)        return false;    return true;}void DFS(int x, int y){    map[x][y] = '.', ans[x][y] = 1;    for(int dx=-1; dx <=1; dx++){        for(int dy=-1; dy<=1; dy++){            if(!dx && !dy)  continue;            if(map[x + dx][y + dy] != 'X')  continue;            DFS(x + dx, y + dy);        }    }    return;}int main(){//    freopen("in.txt", "r", stdin);    int x,y;    while(scanf("%d%d%d%d",&m,&n,&x,&y) == 4){        if(!m && !n && !x && !y)    break;        memset(ans, 0, sizeof(ans));        for(int i=0; i<m; i++)  scanf("%s",map[i]);        DFS(x-1, y-1);        int cnt = 0;        for(int i=0; i<m; i++){            for(int j=0; j<n; j++){                if(ans[i][j]){                    for(int k=0; k<4; k++){                        int dx = i + move[k][0],dy = j + move[k][1];                        if(!IsIn(dx, dy) || !ans[dx][dy])                            cnt++;                    }                }            }        }        printf("%d\n",cnt);    }    return 0;}

0 0