hdu5024

来源:互联网 发布:mac airplay显示器关闭 编辑:程序博客网 时间:2024/06/09 21:58

思路要开阔些,或者说要转化一下思路,别太死

把每个点当拐点,爆一边就可以,用记忆化搜索也行。都不会超时

#include<bits/stdc++.h>using namespace std;int n;#define o ans=max(ans,char C[105][105];int f(int i,int j,int a,int b){    int k=0;    while(1){        if(i<0||j<0||i>=n||j>=n||C[i][j]!='.') break;        i+=a; j+=b; k++;    }    return k;}int main(){    while(scanf("%d",&n)&&n){        for(int i=0;i<n;i++ ) scanf("%s",C[i]);        int ans=-1;        for(int i=0;i<n;i++)        for(int j=0;j<n;j++){            if(C[i][j]=='.'){                o f(i,j,0,1)+f(i,j,1,0)-1);                o f(i,j,0,1)+f(i,j,-1,0)-1);                o f(i,j,0,-1)+f(i,j,1,0)-1);                o f(i,j,0,-1)+f(i,j,-1,0)-1);                o f(i,j,-1,1)+f(i,j,1,1)-1);                o f(i,j,1,1)+f(i,j,1,-1)-1);                o f(i,j,-1,-1)+f(i,j,1,-1)-1);                o f(i,j,-1,-1)+f(i,j,-1,1)-1);            }        }        printf("%d\n",ans);    }    return 0;}

#include<bits/stdc++.h>using namespace std;#define maxn 105int n;const int dx[]= {0,-1,0,1,-1,1,1,-1};const int dy[]= {-1,0,1,0,-1,-1,1,1};int dp[maxn][maxn][8] , ans;char mapp[maxn][maxn];int DFS(int x,int y,int dir){    if(dp[x][y][dir]!=-1) return dp[x][y][dir];    if(mapp[x +dx[dir] ][y+ dy[dir] ]=='.')        return dp[x][y][dir]=1+DFS(x+dx[dir],y+dy[dir],dir);    else return dp[x][y][dir]=1;}void cal(int x,int y,int d1,int d2){    ans = max(ans, DFS(x,y,d1)+DFS(x,y,d2)-1);}int main(){    while(scanf("%d",&n)!=EOF && n){        memset(mapp,1,sizeof(mapp));            memset(dp,-1,sizeof(dp));            ans=-1;        for(int i=0;i<n;i++) scanf("%s",mapp[i]);        for(int i=0;i<n;i++)            for(int j=0;j<n;j++)        {            if(mapp[i][j]=='.'){                for(int k=0;k<4;k++){                    cal(i,j,k%4,(k+1)%4);                    cal(i,j,4+k%4,4+(k+1)%4);                }            }        }        printf("%d\n",ans);    }    return 0;}


0 0
原创粉丝点击