搜索-F

  • 原题

    Description
    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
    >
    XX Grid 1 .XXX Grid 2
    XX .XXX
    .XXX
    …X
    ..X.
    >
    X…
    >
    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:
    >
    Impossible Possible
    >
    XXXX XXXX XXXX XXXX
    X..X XXXX X… X…
    >
    XX.X XXXX XX.X XX.X
    XXXX XXXX XXXX XX.X
    >
    ….. ….. ….. …..
    >
    ..X.. ..X.. ..X.. ..X..
    >
    .X.X. .XXX. .X… …..
    >
    ..X.. ..X.. ..X.. ..X..
    >
    ….. ….. ….. …..
    Input
    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.
    Output
    For each grid in the input, the output contains a single line with the perimeter of the specified object.
    Sample 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
    Sample Output
    8
    18
    40
    48
    8

  • 思路解析
    根据输入的网格和初始坐标,输出从初始坐标出发走过并围成的图形周长。

  • AC代码

#include<iostream>
#include<cstring>
using namespace std;
#define MAX 25
char map[MAX][MAX];
int visit[MAX][MAX];
int dir[8][2]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}};
int r, c, sum;
void dfs(int x, int y)
{
    visit[x][y] = 1;
    for(int i = 0; i < 8; i++)
    {
        int p = x + dir[i][0];
        int q = y + dir[i][1];
        if(p >= 1 && p <= r && q >= 1 && q <= c)
        {
            if(map[p][q] == 'X' && visit[p][q] == 0)
            {
                dfs(p, q);
            }
            else if(map[p][q]=='.' && (p == x || q == y))
            {
                sum++;
            }
        }
        else if (p == x || q == y)
        {
            sum++;
        }
    }
}
int main()
{
    int i, j, x, y;
    while(cin >> r >> c >> x >> y)
    {
        if(x + y + r + c == 0) break;
        for(i = 1; i <= r; i++)
        {
            for(j = 1; j <= c; j++)
            {
                visit[i][j] = 0;
            }
        }
        for(i=1; i <= r; i++)
        {
            for(j = 1; j <= c; j++)
            {
                cin >> map[i][j];
            }
        }
        sum = 0;
        dfs(x, y);
        cout << sum << endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值