hdu5024

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

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

#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 105
int 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;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-15 14:16:49

hdu5024的相关文章

2014 ACM/ICPC Asia Regional Guangzhou Online Wang Xifeng&#39;s Little Plot HDU5024

一道好枚举+模拟题目.转换思维视角 这道题是我做的,规模不大N<=100,以为正常DFS搜索,于是傻乎乎的写了起来.各种条件限制模拟过程 但仔细一分析发现对每个点进行全部八个方向的遍历100X100X100^8 .100X100个点,每个点在走的时候8中选择,TLE 于是改为另一个角度: 以符合要求的点为拐弯点,朝两个垂直的方向走,求出最远的距离.这样只要对每个点各个方向的长度知道,组合一下对应的就OK. 避免了每个点深搜. PS:搜索的时候x,y写反了,导致构图出现问题,以后用[dy][dx]

HDU5024 Wang Xifeng&#39;s Little Plot 【记忆化搜索】

Wang Xifeng's Little Plot Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 319    Accepted Submission(s): 214 Problem Description <Dream of the Red Chamber>(also <The Story of the Stone>)

hdu5024 Wang Xifeng&#39;s Little Plot (水

http://acm.hdu.edu.cn/showproblem.php?pid=5024 网络赛 Wang Xifeng's Little Plot Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 239    Accepted Submission(s): 156 Problem Description <Dream of the

hdu5024 网络赛水题

不用多想  暴力撸就行     枚举每个点   向四周延伸的两条最远距离   最多能转一次90度的弯 #include<stdio.h> #include<string.h> #include<iostream> using namespace std; int dir[8][2]={0,1, 0,-1, 1,0, -1,0, 1,1, 1,-1, -1,1, -1,-1}; int xia[8][2]={1,0, -1,0, 0,-1, 0,1, 1,-1, -1,-

hdu5024(dp)

意甲冠军: 薛期呵和王熙凤不想很接近生活(因为假定他们一起,柴可能取代王熙凤) 现在'.'事情是这样的.'#'一堵墙.薛期呵对宝让生活远: 因此,选择一个最长的公路,让他们住在两端: 路达一个转折点.它是90: 像以下这张图: #.# ##. ..# 最长的路是(图中*的位置) #*# ##* .*# 长度为3: 思路: 计算出每一个点在八个方向上的长度. 然后在把每一个点垂直两个方向的距离加起来(一个点有8种加法) 取全部点的最大值: 计算时,由于假设要算这个点 左上方 延伸多长,就要算算它左

hdu 5024 DFS 2014亚洲区域赛广州网赛

http://acm.hdu.edu.cn/showproblem.php?pid=5024 DFS写的好像质量不太高,昨晚T了,然后睡的时候重新理下思路,今天重写下,750MSAC,太慢了 //#pragma comment(linker, "/STACK:102400000,102400000") #include <cstdio> #include <cstring> #include <algorithm> #include <stri