一道很好玩的题,遍历图,然后标记。最后访问标记周围的长度就可以计算周长啦~
访问poj discuss 的时候,看到各种杯具。。。1111╮(╯▽╰)╭
//求周长 标记后求周围‘。’的个数就OK
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
int r,c,stai,staj;
char map[110][110];
bool vis[110][110];
int dx[]={0,0,1,-1,-1,-1,1,1}; //前四个是上下左右方向
int dy[]={1,-1,0,0,1,-1,-1,1};
void dfs(int x,int y)
{
if(x<1|| x>r || y<1 || y>c || vis[x][y]||map[x][y]=='.')return ;
vis[x][y]=true;
for(int i=0;i<8;i++)
{
int xx=x+dx[i];
int yy=y+dy[i];
dfs(xx,yy);
}
}
int main()
{
int i,j;
while(cin>>r>>c>>stai>>staj && r+c+stai+staj)
{
int len=0;
memset(map,'.',sizeof(map));
memset(vis,false,sizeof(vis));
for(i=1;i<=r;i++)
{
for(j=1;j<=c;j++)
cin>>map[i][j];
getchar();
}
dfs(stai,staj);
for(i=1;i<=r;i++)
{
for(j=1;j<=c;j++)
{
if(vis[i][j])
{
for(int k=0;k<4;k++)
{
if(vis[i+dx[k]][j+dy[k]]==false)
len++;
}
}
}
}
cout<<len<<endl;
}
}