poj 1111bfs

来源:互联网 发布:网络协议基础知识 编辑:程序博客网 时间:2024/05/29 03:33

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

题目大意:

  输入一个矩阵,再输入其中一个“X”的位置(从1开始)。从该位置向八个方向扩展,如果是“X”就可以并在一起。问最后得到的模块的周长是多少。

 

解题思路:

  按照广搜的思路来做。用一个二维的数组标记每一个点,-1代表着该点不能被搜索了(可能原本就是“.”,也可以该点已经出队列了);0代表着该点还没被搜到;1代表着该点已经被搜到,但是还在队列中。(出队的点若与队中的点满足上下左右相邻条件,则对长度还有影响)

  初始周长为4,代表只有一个X时的周长。对于每一个点,如果是“X”,就初始化为标记为0;如果是"."就初始化为-1。

  对于当前进行搜索的X的上下左右四个方向上的X:

①如果被搜到过,且那个点在队列中,就把当前的周长减2;

②如果上下左右的X没有被搜到过,周长加2,并且把那个点入队,并且标记为1。

原因:两个在横向和纵向上相邻的X,它们之间和在一起的周长是4+4-2=4+2,相当于是一个X的周长+2。对于被搜到过的X,由于它又与其它的X相邻,所以周长需要减2。

③对于当前进行搜索的X的东南、西南、东北、西北四个方向的X,如果没有被搜到过,周长加4。

#include <iostream>#include <queue>#include <cstring>using namespace std;int vis[21][21];int n,m,r,c;char maze[21][21];int dir[8][2]={0,1,0,-1,1,0,-1,0,1,1,1,-1,-1,1,-1,-1};bool Judge(int x,int y){    if(x>=0&&x<n&&y>=0&&y<m&&maze[x][y]=='X'&&vis[x][y]!=-1)        return true;    return false;}struct Node{    int x,y;};void bfs(){    queue<Node> q;    Node s,next;    s.x=r-1;s.y=c-1;    q.push(s);    int cnt=4;    vis[r-1][c-1]=1;    while(!q.empty())    {       s=q.front();       q.pop();       vis[s.x][s.y]=-1;       for(int i=0;i<8;i++)       {           if(Judge(s.x+dir[i][0],s.y+dir[i][1]))           {               if(vis[s.x+dir[i][0]][s.y+dir[i][1]]==0)               {                   next.x=s.x+dir[i][0];                   next.y=s.y+dir[i][1];                   vis[next.x][next.y]=1;                   q.push(next);                   if(i<4)                       cnt+=2;                   else cnt+=4;               }               else if(vis[s.x+dir[i][0]][s.y+dir[i][1]]==1)               {                   if(i<4) cnt-=2;               }           }       }    }    cout<<cnt<<endl;    while(!q.empty())q.pop();    memset(vis,0,sizeof(vis));    return ;}int main(){    while(cin>>n>>m>>r>>c)    {        if(n==m&&r==c&&n==r&&n==0) break;        for(int i=0;i<n;i++)            for(int j=0;j<m;j++)            {                cin>>maze[i][j];                if(maze[i][j]=='.') vis[i][j]=-1;                else if(maze[i][j]=='X') vis[i][j]=0;            }        bfs();    }    return 0;}


0 0
原创粉丝点击