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