POJ-1111-Image Perimeters

来源:互联网 发布:村嶋孟 知乎 编辑:程序博客网 时间:2024/05/19 00:49

这个题要求你求出所给点周围围成X图形的周长,需要注意的是方向是八个.

代码:

#include<cstdio>#include<cstring>#include<iostream>#include<queue>using namespace std;struct node{    int x;    int y;};int n,m,sx,sy,ans;char map[22][22];int movex[8]={1,0,-1,0,-1,-1,1,1},movey[8]={0,1,0,-1,-1,1,-1,1};bool vis[22][22];queue<node> q;bool isborder(int x,int y){    if(x<0||x>=n||y<0||y>=m)return true;    return false;}void BFS(int x,int y){    memset(vis,0,sizeof(vis));    q.push((node){x,y});    vis[x][y]=1;    while(!q.empty())    {node v=q.front();q.pop();for(int i=0;i<8;i++){    int itx=v.x+movex[i];    int ity=v.y+movey[i];    if(isborder(itx,ity))    {if(i<4)    ans++;continue;    }    if(map[itx][ity]=='.')    {if(i<4)    ans++;continue;    }    if(!vis[itx][ity])    {vis[itx][ity]=1;q.push((node){itx,ity});    }}    }}int main(){    while(scanf("%d%d%d%d",&n,&m,&sx,&sy)&&(n+m+sx+sy))    {ans=0;for(int i=0;i<n;i++)    scanf("%s",map[i]);sx--;sy--;BFS(sx,sy);printf("%d\n",ans);    }    return 0;}