zoukankan      html  css  js  c++  java
  • poj1111 Image Perimeters 广搜

    题目大意:

      输入一个矩阵,再输入其中一个“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。

      最后输出周长就可以了。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<queue>
     6 using namespace std;
     7 
     8 const int N=22;
     9 int dx[8]={0,0,1,-1,1,1,-1,-1};
    10 int dy[8]={1,-1,0,0,1,-1,1,-1};
    11 
    12 int vis[N][N];
    13 int r,c,s,sx,sy;
    14 struct node
    15 {
    16     int x,y;
    17 };
    18 node a,b;
    19 bool isin(int x,int y)
    20 {
    21     return x>=0&&x<r&&y>=0&&y<c;
    22 }
    23 queue<node> q;
    24 void BFS()
    25 {
    26     while(!q.empty())
    27     {
    28         a=q.front(); q.pop();
    29         vis[a.x][a.y]=-1;
    30         int i;
    31         for(i=0;i<4;i++)
    32         {
    33             int x=a.x+dx[i],y=a.y+dy[i];
    34             if(isin(x,y)&&vis[x][y]==1)
    35             {
    36                 s-=2;
    37                 vis[x][y]=1;
    38             }
    39             if(isin(x,y)&&!vis[x][y])
    40             {
    41                 s+=2;
    42                 b.x=x; b.y=y;
    43                 q.push(b);
    44                 vis[x][y]=1;
    45             }
    46         }
    47         for(i=4;i<8;i++)
    48         {
    49             int x=a.x+dx[i],y=a.y+dy[i];
    50             if(isin(x,y)&&!vis[x][y])
    51             {
    52                 s+=4;
    53                 b.x=x; b.y=y;
    54                 q.push(b);
    55                 vis[x][y]=1;
    56             }
    57         }
    58     }
    59     printf("%d
    ",s);
    60 }
    61 int main()
    62 {
    63     //freopen("test.txt","r",stdin);
    64     char ch;
    65     while(scanf("%d%d%d%d",&r,&c,&sx,&sy)!=EOF&&r)
    66     {
    67         for(int i=0;i<r;i++){
    68             getchar();
    69             for(int j=0;j<c;j++){
    70                 scanf("%c",&ch);
    71                 if(ch=='X') vis[i][j]=0;
    72                 else vis[i][j]=-1;
    73             }
    74         }
    75         a.x=sx-1; a.y=sy-1; s=4;
    76         while(!q.empty()) q.pop();
    77         q.push(a);
    78         BFS();
    79     }
    80     return 0;
    81 }
    View Code

    //还是再从搜索开始吧。

  • 相关阅读:
    PROXY SERVER 代理服务器
    微信小程序跳转navigateTo与redirectTo
    在C#中实现类似位域的操作
    用WPF的Dock控件重写了原来的那个正则表达式测试工具
    获取文件夹所占空间的大小
    索尼正式公布新掌机PSP2——NGP
    一个打印螺旋数的程序
    在C#中实现BigEndian的数字
    通过程序关闭显示器
    索爱的Xperia arc太漂亮了
  • 原文地址:https://www.cnblogs.com/Potato-lover/p/4111808.html
Copyright © 2011-2022 走看看