ZOJ 1047 Image Perimeters

原创 2015年07月09日 19:38:39

Image Perimeters

Time Limit: 2 Seconds      Memory Limit: 65536 KB

Technicians in a pathology lab analyze digitized images of slides. Objects on a slide are selected for analysis by a mouse click on the object. The perimeter of the boundary of an object is one useful measure. Your task is to determine this perimeter for selected objects.

The digitized slides will be represented by a rectangular grid of periods, '.', indicating empty space, and the capital letter 'X', indicating part of an object. Simple examples are

An X in a grid square indicates that the entire grid square, including its boundaries, lies in some object. The X in the center of the grid below is adjacent to the X in any of the 8 positions around it. The grid squares for any two adjacent X's overlap on an edge or corner, so they are connected.

XXX
XXX Central X and adjacent X's
XXX

An object consists of the grid squares of all X's that can be linked to one another through a sequence of adjacent X's. In Grid 1, the whole grid is filled by one object. In Grid 2 there are two objects. One object contains only the lower left grid square. The remaining X's belong to the other object.

The technician will always click on an X, selecting the object containing that X. The coordinates of the click are recorded. Rows and columns are numbered starting from 1 in the upper left hand corner. The technician could select the object in Grid 1 by clicking on row 2 and column 2. The larger object in Grid 2 could be selected by clicking on row 2, column 3. The click could not be on row 4, column 3.


One useful statistic is the perimeter of the object. Assume each X corresponds to a square one unit on each side. Hence the object in Grid 1 has perimeter 8 (2 on each of four sides). The perimeter for the larger object in Grid 2 is illustrated in the figure at the left. The length is 18.

Objects will not contain any totally enclosed holes, so the leftmost grid patterns shown below could NOT appear. The variations on the right could appear:

The input will contain one or more grids. Each grid is preceded by a line containing the number of rows and columns in the grid and the row and column of the mouse click. All numbers are in the range 1-20. The rows of the grid follow, starting on the next line, consisting of '.' and 'X' characters.

The end of the input is indicated by a line containing four zeros. The numbers on any one line are separated by blanks. The grid rows contain no blanks.

For each grid in the input, the output contains a single line with the perimeter of the specified object.


Example input:

2 2 2 2
XX
XX
6 4 2 3
.XXX
.XXX
.XXX
...X
..X.
X...
5 6 1 3
.XXXX.
X....X
..XX.X
.X...X
..XXX.
7 7 2 6
XXXXXXX
XX...XX
X..X..X
X..X...
X..X..X
X.....X
XXXXXXX
7 7 4 4
XXXXXXX
XX...XX
X..X..X
X..X...
X..X..X
X.....X
XXXXXXX
0 0 0 0


Example output:

8
18
40
48
8


题意:告诉n*m的图形,告诉起始点a,b以(a,b)为起点八个方向找联通块,求联通快周长。

思路:搜索来一层层找联通快,对于每个X,起始周长是4,如果X上下左右四个方向有X,那么周长就减一。

#include <iostream>
#include <stdio.h>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm>
#define N 55
using namespace std;

char s[N][N];
int n,m;
int a,b;
int dis[8][2]={0,1,0,-1,1,0,-1,0,-1,-1,-1,1,1,-1,1,1};
int vis[N][N];
int ans;

void dfs(int x,int y)
{
    int cnt=4;
    if(vis[x][y]) return;
    vis[x][y]=1;
    for(int i=0;i<8;i++)
    {
        int xx=x+dis[i][0];
        int yy=y+dis[i][1];

        if(xx<0||yy<0||xx>=n||yy>=m) continue;

        if(s[xx][yy]!='X') continue;

        dfs(xx,yy);
        if(dis[i][0]==0 || dis[i][1]==0) cnt--;
    }
    ans+=cnt;

}

int main()
{
    while(~scanf("%d%d%d%d",&n,&m,&a,&b))
    {
        if(n+m+a+b==0) break;
        a--;b--;

        memset(vis,0,sizeof vis);
        for(int i=0;i<n;i++)
        {
            scanf("%s",s[i]);
        }
        ans=0;
       if(s[a][b]=='X') dfs(a,b);
        printf("%d\n",ans);

    }
    return 0;
}







相关文章推荐

POJ_1111_Image Perimeters【DFS】

/* Image Perimeters Time Limit: 1000MS        Memory Limit: 10000K Total Submissions: 9089        Ac...

POJ 1111 Image Perimeters 简单DFS

http://poj.org/problem?id=1111 Image PerimetersTime Limit: 1000MS Memory Limit: 10000KDescriptionTec...

Image Perimeters

Problem Description Technicians in a pathology lab analyze digitized images of slides. Objects on...

poj 1111||zoj 1047 Image Perimeters(dfs)

题意: 确实很难看懂>_ 一个'X'每个面对应一个点。 分析: 题目看得我吐血,而且浙大的图太坑爹了,最近做的几题都这样,造成视觉上的误差。题中的数据全都小于25,果断dfs虽然没仔细...
  • cqlf__
  • cqlf__
  • 2011年11月20日 18:45
  • 688

hdu 1047 Image Perimeters

Image Perimeters Time Limit: 2MS   Memory Limit: 65536KB   64bit IO Format: %lld & %llu...

ZOJ 1047 Image Perimeters (BFS)

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1047 1.BFS求出所有在同一个object中的X 2.计算周长时分析...

poj 1111 Image Perimeters

题意:给你一个起点的坐标x,y,要求你从这个坐标向相邻八个方向开始扩展,并且对应坐标的值为'X'才能继续扩展。求最后扩展得到的图形的周长。 可以用dfs,其实就是算总周长去掉两个为x的格子的从边...

POJ1111,Image Perimeters,典型dfs,跟八连块差不多

Image Perimeters Description Technicians in a pathology lab analyze digitized images of slides...

POJ 1111 Image Perimeters (裸DFS)

Image Perimeters Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7906   Accepted:...

poj 1111:Image Perimeters

传说中的光棍题。bfs的题目。背景为病理学切片的观察。基本意思是给定一个矩阵,其中用‘X’表示需计数格,‘.’表示空格。求连续的‘X’的周长。其中对角相连的‘X’也为连续。周长只计算‘X’的上下左右四...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ZOJ 1047 Image Perimeters
举报原因:
原因补充:

(最多只允许输入30个字)