hdu 5024——Wang Xifeng's Little Plot

来源:互联网 发布:图片的相似度算法 编辑:程序博客网 时间:2024/06/02 10:05

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

代码如下:

#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
原创粉丝点击