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;
}

原文地址:https://www.cnblogs.com/hpustudent/p/2167906.html