OJ 链接:点击打开链接
题目:
求图像的周长
时限:1000ms 内存限制:10000K 总时限:3000ms
描述:
给一个用 . 和X表示的图形,图形在上、下、左、右、左上、左下、右上、右下8个方向都被看作是连通的,并且图像中间不会出现空洞,求这个图形的边长。
输入:
首先给出m、n、x、y四个正整数,下面给出m×n的图形,x、y表示点击的位置,全0表示结束。
输出:
点击的图形的周长。
输入样例:
2 2 2 2
XX
XX
6 4 2 3
.XXX
.XXX
.XXX
...X
..X.
X...
0 0 0 0
本题思路:1.寻找输入坐标所在的整个区域,注意八个方向连着的就通。
2.求周长(X周围非X的点代表着一单位的长度)
3.不需要判断该图是否连通情况。即直接求即可。
实现以上 : 深搜。(注意是否访问过,访问过的不再求周长)
#include<stdio.h>
#include<string.h>
char g[102][102];
int vist[102][102];
int dx[8]={0,0,1,-1,1,1,-1,-1},dy[8]={1,-1,0,0,-1,1,-1,1};
int dfs(int x,int y)
{
int i,nx,ny;
int sum = 0;
vist[x][y] = 1;
for(i = 0;i<4;i++) //计算周长
{
nx = dx[i] + x ;
ny = dy[i] + y ;
if(g[nx][ny] !='X')sum++; //非X的点
}
for(i = 0;i<8;i++)
{
nx = dx[i] + x ;
ny = dy[i] + y ;
if(vist[nx][ny] == 0 && g[nx][ny] == 'X')
{
sum += dfs(nx,ny);
}
}
return sum;
}
int main()
{
int i,j,m,n,x,y;
char temp;
while(1)
{
scanf("%d %d %d %d",&m,&n,&x,&y);
if(m == 0 && n==0 && x==0 && y == 0)break;
memset(vist,0,sizeof(vist));
memset(g,0,sizeof(g));
scanf("%c",&temp);
for(i = 1;i<=m;i++) //注意输入
{
for(j = 1;j<=n;j++)
{
scanf("%c",&temp);
g[i][j] = temp;
}
scanf("%c",&temp);
}
printf("%d\n",dfs(x,y));
}
}