pku_1111_Image Perimeters

来源:互联网 发布:微信删好友软件 编辑:程序博客网 时间:2024/06/05 00:24

挺有意思的搜索题.难度很基础.

题目大意:

给一个图像,要求从一个点开始搜,这个点所在的八连快的边长.

解题思想:

首先是深度优先或广度优先搜索8连块,然后对于没搜到的一个X像素,判断周围四个点是否是.或者越界.如果是就边长+1.


源代码:


#include <myhead>const int N=27;int n,m;int ans;char graph[N][N];inline int cmp(int x,int y) {if(x>n||y>m)return 1;if(graph[x][y]=='.')return 1;return 0;}int pre(int s,int t) {int x,y,sum=0;for(int i=0;i<4;++i) {x=s+dx[i];y=t+dy[i];sum+=cmp(x,y);}return sum;}void dfs(int s,int t) {ans+=pre(s,t);int x,y;for(int i=0;i<8;++i) {x=s+dx1[i];y=t+dy1[i];if(graph[x][y]!='X') continue;graph[x][y]='@';dfs(x,y);}}int main() {int s,t;while(scanf("%d%d%d%d",&n,&m,&s,&t),n) {ans=0;memset(graph,'.',sizeof(graph));for(int i=1;i<=n;++i) {scanf("%s",graph[i]+1);}graph[s][t]='@';dfs(s,t);printf("%d\n",ans);}return 0;}