zoukankan      html  css  js  c++  java
  • poj1111 DFS

    J - 搜索

    Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u

    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
    题目大意:给你一个矩形图,上面有着用X组成的物体,每一个X与他周围8个方向上的X算是相邻,所有相邻的X算作一个物体,题目会给你搜索的起点,以此确定到底是哪一个物体,然后让你输出该物体的周长,
    每一个X的边长为1,结合样例很容易明白其周长的计算方法。
    思路分析:首先是,周长应该通过什么来进行确定,一个X上下左右不是'X'就'.',X说明相邻,'.'则说明那一侧是边界,所以说可以通过计算该物体中的X周'.'的个数来间接求出其周长。注意应该开两个方向数组,
    一个是8个方向,用来寻找下一个X,进行深搜,一个是4个方向,用来寻找边界,计算周长。
    代码:
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <queue>
    #include <stack>
    using namespace std;
    const int maxn=105;
    char maps[maxn][maxn];
    int f[8][2]={{1,0},{-1,0},{0,1},{0,-1},{-1,-1},{-1,1},{1,-1},{1,1}};
    int m,n,p,q;
    int cnt,flag;
    void dfs(int x,int y)
    {
       maps[x][y]='*';
       for(int i=0;i<4;i++)
       {
           int a=x+f[i][0];
           int b=y+f[i][1];
           if(maps[a][b]=='.') cnt++;
       }
       for(int i=0;i<8;i++)
       {
           int a=x+f[i][0];
           int b=y+f[i][1];
           if(maps[a][b]=='X') dfs(a,b);
       }

    }
    int main()
    {
        while(scanf("%d%d%d%d",&m,&n,&p,&q)&&(m||n||p||q))
        { cnt=0;
            int i,j;
            memset(maps,'.',sizeof(maps));
            for(i=1;i<=m;i++) for(j=1;j<=n;j++)
                cin>>maps[i][j];
            dfs(p,q);
            cout<<cnt<<endl;
        }
    }
    深搜就是状态的转移,你所要做的就是确定两个,一个是在这个状态你要做什么,另一就是如何判断是否进入下一个状态。
    永不停息!
  • 相关阅读:
    eventbus 备注
    Retrofit 备注
    RxJava 备注
    dagger2 备注
    JVM 备注
    UI控件(UIPickerView)
    Android 知识杂记(MVP模式)
    UI控件(UIToolbar)
    UI控件(UIAlertController)
    UI控件(UIScrollView)
  • 原文地址:https://www.cnblogs.com/xuejianye/p/5314166.html
Copyright © 2011-2022 走看看