hdu 5024 Wang Xifeng's Little Plot 2014 ACM/ICPC Asia Regional Guangzhou Online

来源:互联网 发布:阿里域名,动态ip 编辑:程序博客网 时间:2024/04/28 08:56

本来是打算对每个可行点做BFS,每个点都有两个方向的分量,然后扩展点只扩展与之前垂直的方向。不过看了别人的Blog发现直接枚举拐点更容易,复杂度N*N*16*N

本机调试了好久,结果是因为有个地方敲错了。。果真以后结果不对要先仔细看看代码。。。。

#include<iostream>#include<stdio.h>#include<cstdio>#include<stdlib.h>#include<vector>#include<string>#include<cstring>#include<cmath>#include<algorithm>#include<stack>#include<queue>#include <ctype.h>using namespace std;const int maxn=110;int N;int mp[maxn][maxn];int ans;int dx[]={0,-1,0,1,-1,-1,1,1};int dy[]={-1,0,1,0,-1,1,1,-1};int vertical[9]={1,2,3,0,5,6,7,4};//预处理垂直的方向void bruteforce(){    for(int i=0;i<N;i++)    {        for(int j=0;j<N;j++)        {            if(mp[i][j]==1)            {              //  cout<<i<<" "<<j<<endl;                for(int d=0;d<8;d++)                {                    int d2=vertical[d];                    int len=1;                    int x=i;                    int y=j;                    bool dd=0;                    while(x+dx[d]>=0&&x+dx[d]<N&&y+dy[d]>=0&&y+dy[d]<N&&mp[x+dx[d]][y+dy[d]]==1)                    {                        x=x+dx[d];                        y=y+dy[d];                        len++;                        dd=1;                  //      if(i==0&&j==0) cout<<d<<" d "<<x<<" "<<y<<" "<<len<<endl;                    }                 //   cout<<endl;                    x=i;                    y=j;                    bool dd2=1;                    while(x+dx[d2]>=0&&x+dx[d2]<N&&y+dy[d2]>=0&&y+dy[d2]<N&&mp[x+dx[d2]][y+dy[d2]]==1)                    {                        dd2=0;                        x=x+dx[d2];                        y=y+dy[d2];                        len++;                   //     if(i==0&&j==0) cout<<d<<" d2 "<<x<<" "<<y<<" "<<len<<endl;                    }                    ans=max(ans,len);                   // cout<<dx[d]<<" "<<dy[d]<<endl;                    //cout<<i<<" "<<j<<" "<<len<<endl;                    //cout<<i<<" "<<j<<endl;                }            }        }    }}int main(){    freopen("input.txt","r",stdin);  //  freopen("data.txt","r",stdin);  //  freopen("out1.txt","w",stdout);  while(true)  {      scanf("%d",&N);      memset(mp,0,sizeof(mp));      ans=0;      if(N==0) break;      else      {          char s;          for(int i=0;i<N;i++)          {              for(int j=0;j<N;j++)              {                //scanf("%c",&s);                cin>>s;                if(s=='#')                {                    mp[i][j]=0;                }                else if(s=='.')                {                    mp[i][j]=1;                }              }          }          bruteforce();          printf("%d\n",ans);      }  }    return 0;}


0 0
原创粉丝点击