poj1111 Image Perimeters

题意:给定一个地图,和一个X计算包围给定X的最大的周长。 

 

 1//用栈实现

 2  // 简单深搜,边界向四个方向搜索,其他的向8个方向搜索

 3 //周围用‘*’代表省去边界判断 

 4  #include<cstring>
 5  #include<algorithm>
 6  #include<cstdio>
 7  #include<stack>
 8  using  namespace  std;
 9  const  int  MAX = 100 ;
10  struct  node
11  {
12       int  x,y;
13  }st;
14  char  map[MAX][MAX];
15  int  vis[MAX][MAX];
16  int  n,m,a,b,ans;
17  int  dx[ 8 ]={- 1 ,- 1 ,- 1 , 0 , 0 , 1 , 1 , 1 };
18  int  dy[ 8 ]={- 1 , 0 , 1 ,- 1 , 1 ,- 1 , 0 , 1 };
19  int  da[ 4 ]={ 1 , 0 ,- 1 , 0 };
20  int  db[ 4 ]={ 0 , 1 , 0 ,- 1 };
21  int  dfs(node st)
22  {
23      stack<node> p; node v,vn;
24      vis[st.x][st.y]= 1 ;
25      p.push(st);
26       while (!p.empty())
27      {
28          v=p.top(); p.pop();
29           for ( int  j= 0 ;j< 4 ;j++)
30          {
31               int  aa=v.x+da[j];
32               int  bb=v.y+db[j];
33               if (map[aa][bb]== ' . ' ) ans++;
34          }
35           for ( int  i= 0 ;i< 8 ;i++)
36          {
37              vn.x=v.x+dx[i];
38              vn.y=v.y+dy[i];
39               if (vn.x>= 0 &&vn.x<n+ 2 &&vn.y>= 0 &&vn.y<m+ 2 &&!vis[vn.x][vn.y])
40              {
41                   if (map[vn.x][vn.y]== ' X ' ) vis[vn.x][vn.y]= 1 ,p.push(vn);
42              }
43          }
44      }
45  }
46  int  main()
47  {
48       while (scanf( " %d %d %d %d " ,&n,&m,&a,&b)&&(n||m||a||b))
49      {
50          memset(vis, 0 , sizeof (vis));
51           for ( int  i= 1 ;i<=n;i++)
52          {
53              getchar();
54               for ( int  j= 1 ;j<=m;j++)
55              {
56                  scanf( " %c " ,&map[i][j]);
57              }
58          }
59           for ( int  i= 0 ;i<=m+ 1 ;i++) map[ 0 ][i]=map[n+ 1 ][i]= ' . ' ;
60           for ( int  i= 0 ;i<=n+ 1 ;i++) map[i][ 0 ]=map[i][m+ 1 ]= ' . ' ;
61          ans= 0 ; st.x=a; st.y=b;
62          dfs(st);
63          printf( " %d\n " ,ans);
64      }
65       return  0 ;
66  }

转载于:https://www.cnblogs.com/acvc/p/3524334.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值