求图像的周长
时限:1000ms 内存限制:10000K 总时限:3000ms
描述:
给一个用 . 和X表示的图形,图形在上、下、左、右、左上、左下、右上、右下8个方向都被看作是连通的,并且图像中间不会出现空洞,求这个图形的边长。
输入:
首先给出m、n、x、y四个正整数,下面给出m×n的图形,x、y表示点击的位置,全0表示结束。
输出:
点击的图形的周长。
输入样例:
2 2 2 2XXXX6 4 2 3.XXX.XXX.XXX...X..X.X...0 0 0 0
输出样例:
818
答案如下:
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
char map[10][10]={0};
int m,n,x,y;
int row[8]={-1,1,0,0,-1,1,-1,1};
int cow[8]={0,0,-1,1,-1,-1,1,1};
int ans[100];
void search(int x,int y);
void dfs(int x,int y);
int len();
int main()
{
int k=0;
while(1)
{
cin>>m>>n>>x>>y;
if(m==0&&n==0&&x==0&&y==0) break;
scanf("\n");
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
map[i][j]='0';
}
}
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
scanf("%c",&map[i][j]);
}
if(i!=m-1) scanf("\n");
}
if(map[x-1][y-1]=='.')
{
printf("0\n");
break;
}
dfs(x,y);
ans[k++]=len();
}
for(int i=0;i<k;i++)
{
printf("%d\n",ans[i]);
}
return 0;
}
void dfs(int x,int y)
{
int xt,yt,i;
if(map[x-1][y-1]=='X')
{
map[x-1][y-1]='1';
for(i=0;i<8;i++)
{
xt=x+row[i];
yt=y+cow[i];
if(xt<1||yt<1||xt>m||yt>n) continue;
dfs(xt,yt);
}
}
}
int len()
{
int ans=0;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
{
if(map[i][j]=='1')
{
if(i==0||map[i-1][j]=='.') ans+=1;
if(j==0||map[i][j-1]=='.') ans+=1;
if(i==m-1||map[i+1][j]=='.') ans+=1;
if(j==n-1||map[i][j+1]=='.') ans+=1;
}
}
return(ans);
}