poj 1111 dfs求面积问题

来源:互联网 发布:研究生小论文数据造假 编辑:程序博客网 时间:2024/06/07 00:11

题目链接 https://vjudge.net/contest/146654#problem/K;  http://poj.org/problem?id=1111;

首先,来说说我的思路吧,最近在做dfs但只会一些简单题,就以这道题为例子来帮助自己回忆一下dfs的套路吧。嘿嘿大笑

题目大意就是给你一个图和一个点 你用算出这个点X区域组成的 面积。刚开始也是不知道这咋整,因为这个图像并不是规则的。但观察久了就会发现这个图形的面积就

等于附近的“点”的数目。但又有一个问题了,边缘点没有点怎么读入,这里我就采用了初始化地图时候用的 memset(map,'.',sizeof(map));这一步然后读入图的时候从1开始读入

这样就可以判断边缘点的点的数目。

其次,还有一点 我wa了好多次才发现的,边缘点不能用vis数组标记 如果标记的话会漏算好多的。


看着说起来蛮轻松的,其实实现起来快让我崩溃了,然后慢慢研究题解才有了点思路。

#include <iostream>#include<stdio.h>#include<string.h>using namespace std;char map[30][30];bool vis[30][30];int dir[8][2]={0,-1 ,0,1 ,-1,0 ,1,0 ,-1,-1 ,-1,1, 1,-1 ,1,1};int di1[4][2]={0,-1 ,0,1 ,-1,0 ,1,0};int n,m,x,y,sum;bool check(int x,int y){    if(x<0||x>n+1||y<0||y>m+1) return 0;    return 1;}void dfs(int x,int y){    if(check(x,y)==0||map[x][y]!='X') return;    vis[x][y]=1;    int xx,yy;    for(int j=0;j<4;j++)    {        xx=x+di1[j][0];        yy=y+di1[j][1];    if(check(xx,yy)&&map[xx][yy]=='.'&&vis[xx][yy]==0)    {            ++sum;    }    }    for(int i=0;i<8;i++)    { int dx,dy;      dx=x+dir[i][0];      dy=y+dir[i][1];      if(check(dx,dy)&&vis[dx][dy]==0&&map[dx][dy]=='X')     {       dfs(dx,dy);     }    }    return;}int main(){    while(scanf("%d%d%d%d",&n,&m,&x,&y)!=EOF)    {        getchar();        if(n==0||m==0||x==0||y==0) break;        memset(vis,0,sizeof(vis));        memset(map,'.',sizeof(map));        sum=0;        for(int i=1;i<=n;i++)            for(int j=1;j<=m;j++)        scanf(" %c",&map[i][j]);        dfs(x,y);        printf("%d\n",sum);    }    return 0;}

0 0
原创粉丝点击