liwei的专栏

记录生活与学习的点点滴滴

DFS专攻:POJ 1111

题意就是求周长,给出坐标,X能连成怎么样的图形都求出周长……

刚开始边界错了,今天重新看了又调了好久才AC……因为X和其他的如果相连的话,会有两个重的而且都不能要,比如:XX,两个X中间的两个两条都不能取,所以-2,因为-2了所以这个X就不能再要了,让其变成 '.' 就行了……因为只有上下左右的边才会重合,所以四个顶角的那四个就不用考虑啦……

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<set>
#include<vector>
#include<stack>
#include<ctime>
#include<cstdlib>
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long ll;
using namespace std;
int n,m,p,q,sum;
char a[22][22];
void dfs(int x,int y)
{
    if(a[x][y]=='.') return;
    a[x][y]='.';
    sum+=4;
    if(a[x+1][y]=='X') sum-=2;
    if(a[x-1][y]=='X') sum-=2;
    if(a[x][y+1]=='X') sum-=2;
    if(a[x][y-1]=='X') sum-=2;
    dfs(x,y+1);
    dfs(x,y-1);
    dfs(x+1,y);
    dfs(x-1,y);
    dfs(x+1,y+1);
    dfs(x-1,y+1);
    dfs(x+1,y-1);
    dfs(x-1,y-1);
}
int main()
{
    while(cin>>n>>m>>p>>q&&(n||m||p||q))
    {
        int i,j;
        sum=0;
        mem(a,'.');
        for(i=1;i<=n;i++)
            for(j=1;j<=m;j++)
                cin>>a[i][j];
        dfs(p,q);
        cout<<sum<<endl;
    }
    return 0;
}

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭