一开始周长统计想了好久,后来发现旁边是空格就行。

还是很像swim..嗯

#include<iostream>
#include<cstring>
#include<queue>
#define MAXN 25
using namespace std; char a[MAXN][MAXN];
bool vis[MAXN][MAXN];
bool b[MAXN][MAXN][5];
int m,n,sx,sy; int dx[8]= {0,1,1,1,0,-1,-1,-1};
int dy[8]= {1,1,0,-1,-1,-1,0,1}; inline bool pd(int x,int y) {
if(x<1||x>m||y<1||y>n) return false;
return true;
} void dfs(int x,int y) {
if(!pd(x,y)) return;
a[x][y]='O';
for(int i=0; i<=7; i++) {
int nx=x+dx[i],ny=y+dy[i];
if(pd(nx,ny)) {
if(!vis[nx][ny]&&a[nx][ny]=='X') {
vis[nx][ny]=1;
dfs(nx,ny); }
}
}
} int calc() {
int i,j;
int cnt=0;
for(i=1; i<=m; i++) {
for(j=1; j<=n; j++) {
if(a[i][j]=='O') {
if(a[i+1][j]=='.'||a[i+1][j]==0) cnt++;
if(a[i-1][j]=='.'||a[i-1][j]==0) cnt++;
if(a[i][j+1]=='.'||a[i][j+1]==0) cnt++;
if(a[i][j-1]=='.'||a[i][j-1]==0) cnt++;
}
}
}
return cnt;
} int main() {
while(cin>>m>>n>>sx>>sy) {
if(m==0&&n==0&&sx==0&&sy==0) return 0;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(vis,0,sizeof(vis));
int i,j;
for(i=1; i<=m; i++) {
for(j=1; j<=n; j++) {
cin>>a[i][j];
}
}
dfs(sx,sy);
int ans=calc();
cout<<ans<<endl;
}
return 0;
}
05-17 02:57