题意:
在一个图中,'x'表示该点可以经过,'.'表示该点不可经过,现在给你一个初始点的坐标,与该点相邻的8个点可以访问,当访问了所有可以经过的点之后,求访问点形成图形的周长.。
解题思路:
对于这个问题,为了方便问题的解决,可以将问题分为两个部分来完成,首先dfs对所有可以进行访问的点进行搜索,进行标记,然后对所有标记的点进行判断四周那些边可以加入到周长中计算。注意判断的条件是非'X'。
// by monstor
#include <iostream>
#include <cstdio>
using namespace std;
char map[50][50];
int vis[50][50];
int n,m,x,y;
int sum;
int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
void init()
{
for(int i=0;i<50;i++)
for(int j=0;j<50;j++)
{
map[i][j]='.';
vis[i][j]=0;
}
}
void bfs(int a,int b)
{
int i,j;
for(i=a-1;i<=a+1;i++)
for(j=b-1;j<=b+1;j++)
if(map[i][j]=='X') //数组较大存储是从1开始,不用判断是否在N*M的范围内
{
if(vis[i][j]==0){
vis[i][j]=1; //进行访问标记,防止出现死循环递归
bfs(i,j);
}
}
}
int main()
{
int i,j,k;
int a,b;
while(scanf("%d%d%d%d",&n,&m,&x,&y)!=EOF)
{
if(n==0 && m==0) break;
init(); //注意初始化
sum=0;
for(i=1;i<=n;i++)
scanf("%s",map[i]+1);
if(map[x][y]=='X') // 如果给出的初始坐标为'.' 则不进行递归,直接结束
{
vis[x][y]=1;
bfs(x,y);
}
else {printf("0\n");continue;
}
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(vis[i][j]==1)
{
for(k=0;k<4;k++)
{
a=i+dir[k][0];
b=j+dir[k][1];
if(map[a][b]!='X')
sum++; // 在字符串的结尾会默认添加'\0'导致出错 注意。
}
}
printf("%d\n",sum);
}
return 0;
}