标签:des style blog http color io os java ar
http://acm.hdu.edu.cn/showproblem.php?pid=5024
分析:预处理每个点在八个方向的射线长度,再枚举八种L形状的路,取最大值。
注意题意是求一条最长路,要么一条直线,要么只有一个90角,即L型。其实直线就是L形的一个方向长度为0。
代码:
#include<iostream>
#include<map>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#define MOD 1000000007
typedef long long ll;
using namespace std;
char g[105][105];
int num[105][105][8];
int n;
void init()
{
    memset(num,0,sizeof num);
    for(int i=0;i<n;i++)
    {
        num[0][i][0]=g[0][i]=='.',num[i][0][0]=g[i][0]=='.';
        num[0][i][1]=g[0][i]=='.';
        num[0][i][2]=g[0][i]=='.',num[i][n-1][2]=g[i][n-1]=='.';
        num[i][n-1][3]=g[i][n-1]=='.';
        num[n-1][i][4]=g[n-1][i]=='.',num[i][n-1][4]=g[i][n-1]=='.';
        num[n-1][i][5]=g[n-1][i]=='.';
        num[n-1][i][6]=g[n-1][i]=='.',num[i][0][6]=g[i][0]=='.';
        num[i][0][7]=g[i][0]=='.';
    }
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
        {
            if(i&&j)num[i][j][0]=g[i][j]=='.'?num[i-1][j-1][0]+1:0;
            if(i)num[i][j][1]=g[i][j]=='.'?num[i-1][j][0]+1:0;
            if(i&&j){int jj=n-1-j;num[i][jj][2]=g[i][jj]=='.'?num[i-1][jj+1][2]+1:0;}
            if(j){int jj=n-1-j;num[i][jj][3]=g[i][jj]=='.'?num[i][jj+1][3]+1:0;}
            if(i&&j){int ii=n-1-i,jj=n-1-j;num[ii][jj][4]=g[ii][jj]=='.'?num[ii+1][jj+1][4]+1:0;}
            if(i){int ii=n-1-i;num[ii][j][5]=g[ii][j]=='.'?num[ii+1][j][5]+1:0;}
            if(i&&j){int ii=n-1-i;num[ii][j][6]=g[ii][j]=='.'?num[ii+1][j-1][6]+1:0;}
            if(j)num[i][j][7]=g[i][j]=='.'?num[i][j-1][7]+1:0;
        }
}
int main()
{
    while(~scanf("%d",&n)&&n)
    {
        for(int i=0;i<n;i++)
            scanf("%s",g[i]);
        int ans=0;
        init();
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
            {
                ans=max(ans,num[i][j][0]+num[i][j][2]-1);
                ans=max(ans,num[i][j][2]+num[i][j][4]-1);
                ans=max(ans,num[i][j][4]+num[i][j][6]-1);
                ans=max(ans,num[i][j][6]+num[i][j][0]-1);
                ans=max(ans,num[i][j][1]+num[i][j][3]-1);
                ans=max(ans,num[i][j][3]+num[i][j][5]-1);
                ans=max(ans,num[i][j][5]+num[i][j][7]-1);
                ans=max(ans,num[i][j][7]+num[i][j][1]-1);
            }
        printf("%d\n",ans);
        /*for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                for(int k=0;k<8;k++)
                    printf("%d%c",num[i][j][k],k==7?'\n':' ');*/
    }
    return 0;
}3 #.# ##. ..# 3 ... ##. ..# 3 ... ### ..# 3 ... ##. ... 0
3 4 3 5
poj 5024&&&2014 ACM/ICPC Asia Regional Guangzhou Online 1003(预处理)
标签:des style blog http color io os java ar
原文地址:http://blog.csdn.net/u014569598/article/details/39434287