zoukankan      html  css  js  c++  java
  • Image Perimeters(图像周长)

    poj 1111

    题目大意:给出一个地图,‘x’代表有效区域,‘.’代表空白区域,在给出鼠标点击的位置,求鼠标点击位置的有效区域的周长是多大

    解决:BFS,关键是如何求周长的问题,由于一个‘x’,有四个面,如果该格子四周周围有n个面(只需统计四周,而不是八个方向都需要统计),

    则这个‘x’的有效周长是4-n,

    如何知道周围有多少个面,只需要在四个面遍历的时候记录下就行了,用了一个vis数组表示i,j这个地方有没有‘x’存在,vis数组是一直不变的

    而BFS中访问过的用‘.’,以免重复访问。

    #include <iostream>
    #include <cstring>
    #include <queue>
    using namespace std;
    int m,n,sx,sy;
    char map[25][25];
    bool vis[25][25];
    int dx[]={1,-1,0,0,1,-1,1,-1};
    int dy[]={0,0,-1,1,1,-1,-1,1};
    struct node
    {
        int x,y;
        node(){}
        node(int xx,int yy):x(xx),y(yy){}
    };
    void bfs(int x,int y)
    {
        queue<node> q;
        q.push(node(x,y));
        map[x][y]='.';
        node t,tmp;
        int i,sum=0,inc;
        while(!q.empty())
        {
            t=q.front();
            inc=0;
            q.pop();
            for(i=0;i<4;i++)
            {
                tmp=node(t.x+dx[i],t.y+dy[i]);
                if(tmp.x>=0 && tmp.x <m && tmp.y>=0 && tmp.y<n )
                {
                    if(vis[tmp.x][tmp.y])inc++;
                    if( map[tmp.x][tmp.y]=='X')
                    {
                        map[tmp.x][tmp.y]='.'; 
                        q.push(tmp);
                    }
                }
            }
            
            sum+=4-inc;
            
            for(;i<8;i++)
            {
                tmp=node(t.x+dx[i],t.y+dy[i]);
                if(tmp.x>=0 && tmp.x <m && tmp.y>=0 && tmp.y<n && map[tmp.x][tmp.y]=='X')
                {
                   map[tmp.x][tmp.y]='.'; 
                   q.push(tmp);
                }
            }
        }
        cout<<sum<<endl;
    }
    int main()
    {
        while(cin>>m>>n>>sx>>sy,m||n||sx||sy)
        {
            memset(vis,0,sizeof(vis));
            for(int i=0;i<m;i++)cin>>map[i];
            for(int i=0;i<m;i++)
               for(int j=0;j<n;j++)
                if(map[i][j]=='X')vis[i][j]=1;
            bfs(sx-1,sy-1);
        }
        system("pause");
        return 0;
    }
    

  • 相关阅读:
    EncodeLDPC校验矩阵H的高斯变换
    Linuxubuntu学习(一)
    tcp通信
    HTTP协议,超文本传输协议
    局部变量成员变量
    线程
    正则表达式
    面向对象
    String类
    Object类
  • 原文地址:https://www.cnblogs.com/hpustudent/p/2167906.html
Copyright © 2011-2022 走看看