HDU 5024 Wang Xifeng's Little Plot(2014广州网络赛1003)


写了1h的DFS,简直被自己的代码吓哭了。。不过起码还是思路清晰,QUQ~

说一下题意吧: 题意是求一条最长路,最多能经过一次转弯,并且其角度只能为90度。

拿第一个样例来说:(0,1)->(1,2)->【转弯】(2,1) ,所以答案是3.

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5024

代码如下:


#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cctype>
#include<algorithm>
#include<string>
#include<map>
#define N 111
#define LL long long
using namespace std;

int n,ans;
char g[N][N];
//八个dfs因为要相互调用,故用类包装。
class dfs
{
public:
    //x,y,s分别表示坐标和路长,v是记录发生过几次转向。
    void dfsl(int x,int y,int s,int v) //向左。
    {
        ans=max(ans,s);
        if(y-1>=0 && g[x][y-1]=='.') //还能向左
            dfsl(x,y-1,s+1,v);
        else
        {
            if(v<1)//否则向上或向下
            {
                if(x-1>=0 && g[x-1][y]=='.') dfsu(x-1,y,s+1,v+1);
                if(x+1<n && g[x+1][y]=='.') dfsd(x+1,y,s+1,v+1);
            }
            return ;
        }
    }
    void dfsr(int x,int y,int s,int v) //向右。
    {
        ans=max(ans,s);
        if(y+1<n && g[x][y+1]=='.')
            dfsr(x,y+1,s+1,v);
        else
        {
            if(v<1)
            {
                if(x-1>=0 && g[x-1][y]=='.') dfsu(x-1,y,s+1,v+1);
                if(x+1<n && g[x+1][y]=='.') dfsd(x+1,y,s+1,v+1);
            }
            return ;
        }
    }
    void dfsu(int x,int y,int s,int v) //向上。
    {
        ans=max(ans,s);
        if(x-1>=0 && g[x-1][y]=='.')
            dfsu(x-1,y,s+1,v);
        else
        {
            if(v<1)
            {
                if(y-1>=0 && g[x][y-1]=='.') dfsl(x,y-1,s+1,v+1);
                if(y+1<n && g[x][y+1]=='.') dfsr(x,y+1,s+1,v+1);
            }
            return ;
        }
    }
    void dfsd(int x,int y,int s,int v) //向下。
    {
        ans=max(ans,s);
        if(x+1<n && g[x+1][y]=='.')
            dfsd(x+1,y,s+1,v);
        else
        {
            if(v<1)
            {
                if(y-1>=0 && g[x][y-1]=='.') dfsl(x,y-1,s+1,v+1);
                if(y+1<n && g[x][y+1]=='.') dfsr(x,y+1,s+1,v+1);
            }
            return ;
        }
    }
    void dfslu(int x,int y,int s,int v) //向左上。
    {
        ans=max(ans,s);
        if(x-1>=0 && y-1>=0 && g[x-1][y-1]=='.')
            dfslu(x-1,y-1,s+1,v);
        else
        {
            if(v<1)
            {
                if(x+1<n && y-1>=0 && g[x+1][y-1]=='.')
                    dfsld(x+1,y-1,s+1,v+1);
                if(x-1>=0 && y+1<n && g[x-1][y+1]=='.')
                    dfsru(x-1,y+1,s+1,v+1);
            }
            return ;
        }
    }
    void dfsrd(int x,int y,int s,int v) //向右下。
    {
        ans=max(ans,s);
        if(x+1<n && y+1<n && g[x+1][y+1]=='.')
            dfsrd(x+1,y+1,s+1,v);
        else
        {
            if(v<1)
            {
                if(x+1<n && y-1>=0 && g[x+1][y-1]=='.')
                    dfsld(x+1,y-1,s+1,v+1);
                if(x-1>=0 && y+1<n && g[x-1][y+1]=='.')
                    dfsru(x-1,y+1,s+1,v+1);
            }
            return ;
        }
    }
    void dfsru(int x,int y,int s,int v) //向右上。
    {
        ans=max(ans,s);
        if(x-1>=0 && y+1<n && g[x-1][y+1]=='.')
            dfsru(x-1,y+1,s+1,v);
        else
        {
            if(v<1)
            {
                if(x-1>=0 && y-1>=0 && g[x-1][y-1]=='.')
                    dfslu(x-1,y-1,s+1,v+1);
                if(x+1<n && y+1<n && g[x+1][y+1]=='.')
                    dfsrd(x+1,y+1,s+1,v+1);
            }
            return ;
        }
    }
    void dfsld(int x,int y,int s,int v) //向左下。
    {
        ans=max(ans,s);
        if(x+1<n && y-1>=0 && g[x+1][y-1]=='.')
            dfsld(x+1,y-1,s+1,v);
        else
        {
            if(v<1)
            {
                if(x-1>=0 && y-1>=0 && g[x-1][y-1]=='.')
                    dfslu(x-1,y-1,s+1,v+1);
                if(x+1<n && y+1<n && g[x+1][y+1]=='.')
                    dfsrd(x+1,y+1,s+1,v+1);
            }
            return ;
        }
    }
};

int main()
{
    while(~scanf("%d",&n),n)
    {
        for(int i=0;i<n;i++)
            scanf("%s",g[i]);
        dfs q;
        ans=0;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(g[i][j]=='.')
                {
                    if(j-1>=0 && g[i][j-1]=='.')
                        q.dfsl(i,j-1,1,0);
                    if(j+1<n && g[i][j+1]=='.')
                        q.dfsr(i,j+1,1,0);
                    if(i-1>=0 && g[i-1][j]=='.')
                        q.dfsu(i-1,j,1,0);
                    if(i+1<n && g[i+1][j]=='.')
                        q.dfsd(i+1,j,1,0);
                    if(i-1>=0 && j-1>=0 && g[i-1][j-1]=='.')
                        q.dfslu(i-1,j-1,1,0);
                    if(i+1<n && i+1<n && g[i+1][j+1]=='.')
                        q.dfsrd(i+1,j+1,1,0);
                    if(i+1<n && j-1>=0 && g[i+1][j-1]=='.')
                        q.dfsld(i+1,j-1,1,0);
                    if(i-1>=0 && j+1<n && g[i-1][j+1]=='.')
                        q.dfsru(i-1,j+1,1,0);
                }
            }
        }
        printf("%d\n",ans+1); //ans+1.因为我没算起始点。
    }
    return 0;
}



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值