hdu 5024——Wang Xifeng's Little Plot

13 篇文章 0 订阅

题意:找两个点,距离最远,并且中间只能转一个弯。每个点可以向相邻的八个方向走

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int m[105][105];

int dir[8][2]={-1,0,0,-1,0,1,1,0,-1,-1,1,-1,1,1,-1,1};
bool vis[105][105];
int n;

int dfs(int i,int j,int ldir,bool turn,int s)
{
//    cout<<i<<' '<<j<<' '<<ldir<<endl;
vis[i][j]=1;
    int ret=0;
    for(int d=s;d<s+4;++d)
    {
        if(turn==1&&d!=ldir)continue;
        int ii=i+dir[d][0];
        int jj=j+dir[d][1];
//        cout<<"???"<<ii<<' '<<jj<<' '<<s<<' '<<dir[d][0]<<' '<<dir[d][1]<<endl;
        if(vis[ii][jj])continue;
        if(i+dir[d][0]>=0&&i+dir[d][0]<n&&j+dir[d][1]>=0&&j+dir[d][1]<n)
        {
//            cout<<"zzzzzzzzzzzzzz"<<ii<<' '<<jj<<' '<<m[ii][jj]<<endl;
            if(m[ii][jj]==1)
            {
//                cout<<"pppppppppppp"<<endl;
                if(d==ldir)
                {
//                    cout<<"1111"<<endl;
                    ret=max(ret,1+dfs(ii,jj,d,turn,s));
                }
                else if(ldir==-1)
                {
//                    cout<<"2222"<<endl;
                   ret=max(ret,1+dfs(ii,jj,d,turn,s));
                }
                else
                {
//                    cout<<"3333"<<' '<<turn<<' '<<d<< ' '<<ldir<<endl;
                   ret=max(ret,1+dfs(ii,jj,d,1,s));
                }
            }
        }
    }
//    cout<<"ret="<<ret<<endl;
    return ret;
}

int main()
{
//    freopen("data.txt","r",stdin);

    while(scanf("%d",&n))
    {
//        cout<<"n="<<n<<endl;
        if(n==0)break;
        int tot=0;
        for(int i=0;i<n;++i)
        {
            for(int j=0;j<n;++j)
            {
                char p;
                scanf("%c",&p);
                while(p!='.'&&p!='#')p=getchar();
                if(p=='.'){m[i][j]=1;}
                else m[i][j]=0;

            }
        }
//        for(int i=0;i<n;++i)
//        {
//            for(int j=0;j<n;++j)
//                cout<<m[i][j];
//            cout<<endl;
//        }
        int ans=0;
        for(int i=0;i<n;++i)
        {
            for(int j=0;j<n;++j)
            {
//                cout<<m[i][j]<<' ';
                if(m[i][j]==1)
                {
                    memset(vis,0,sizeof(vis));
                    ans=max(ans,dfs(i,j,-1,0,0));
                    memset(vis,0,sizeof(vis));
                    ans=max(ans,dfs(i,j,-1,0,4));
                }
            }
//            cout<<endl;
        }
//        cout<<endl;
        printf("%d\n",ans+1);
    }
    return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值