时限: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
输出样例
8 18
提示
参考迷宫问题,实现时关键要解决好各块的表示问题。
还要注意点击的点是一定会进去的,不要忘记标记了。
#include <iostream>
#include <stdio.h>
#include <string.h>
int m, n, dx[8] = { -1,-1,-1,0,0,1,1,1}, dy[8] = { -1,0,1,-1,1,-1,0,1 }, ans;
char grid[102][102],standard;
bool vis[102][102];
void dfs(int x0, int y0)
{
int i;
if (x0 - 1 < 0 || grid[x0 - 1][y0] != standard)//检测上方
{
ans++;
}
if (y0 - 1 < 0 || grid[x0][y0 - 1] != standard)//检测左方
{
ans++;
}
if (x0 + 1 > n - 1 || grid[x0 + 1][y0]!= standard)//检测下方
{
ans++;
}
if (y0 + 1 > m - 1 || grid[x0][y0 + 1] != standard)//检测右方
{
ans++;
}
for (i = 0; i <= 7; i++)
{
if (vis[x0+dx[i]][y0+dy[i]]==false&&x0+dx[i]>=0&&x0+dx[i]<=m-1&&y0+dy[i]>=0&&y0+dy[i]<=n-1&&grid[x0 + dx[i]][y0 + dy[i]] == standard)//可拓展
{
vis[x0 + dx[i]][y0 + dy[i]] = true;
dfs(x0 + dx[i], y0 + dy[i]);
}
}
return;
}
int main()
{
int i, j,x,y;
while (1)
{
scanf("%d%d%d%d", &m, &n, &x, &y);//m行,n列
if (m == 0 && n == 0 && x == 0 && y == 0)
{
break;
}
ans = 0;
memset(vis, false, sizeof(vis));
getchar();
for (i = 0; i <= m - 1; i++)
{
for (j = 0; j <= n - 1; j++)
{
scanf("%c", &grid[i][j]);
}
getchar();
}
standard = grid[x - 1][y - 1];
vis[x - 1][y - 1] = true;
dfs(x - 1, y - 1);
printf("%d\n", ans);
}
return 0;
}