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;
}