poj1111 Image Perimeters

poj1111 Image Perimeters

http://poj.org/problem?id=1111


解题思路:重叠性的,可以说是双从的广度优先搜索,是基本广度优先搜索的拓展。


给一个图,n行m列,由X和。组成


12055559 20114045007 1111 Accepted 180K 0MS C++ 1303B 2013-08-30 15:17:23

#include<stdio.h> #include<string.h> #include<queue> using namespace std; int n,m,sx,sy; int flag[25][25]; int dir[8][2]={1,0,0,1,-1,0,0,-1,1,1,-1,1,1,-1,-1,-1}; int dircul[4][2]={1,0,0,1,-1,0,0,-1}; struct node {     int x;     int y; }; int bfs() {     int i,j;     int xx,yy;     int sum=0;     node now,next;     queue<node> q;     now.x=sx;     now.y=sy;     flag[sx][sy]=2;     q.push(now);     while(!q.empty())     {         now=q.front();         q.pop();         for(i=0;i<4;i++)         {             xx=now.x+dircul[i][0];             yy=now.y+dircul[i][1];             if(!flag[xx][yy])sum++;         }         for(i=0;i<8;i++)         {             next.x=now.x+dir[i][0];             next.y=now.y+dir[i][1];             if(flag[next.x][next.y]==1)             {                 q.push(next);                 flag[next.x][next.y]=2;             }          }     }     return sum; } int main() {     char x[25];     int i,j;     while(scanf("%d%d%d%d",&n,&m,&sx,&sy)&&n||m||sx||sy)     {         memset(flag,0,sizeof(flag));         for(i=1;i<=n;i++)         {             scanf("%s",x+1);             for(j=1;j<=m;j++)                 if(x[j]=='X')flag[i][j]=1;         }         printf("%d\n",bfs());     }     return 0; }


你可能感兴趣的:(广度优先搜索,bfs)