hdoj5024【BFS/暴力】

来源:互联网 发布:鞋子淘宝试用报告范文 编辑:程序博客网 时间:2024/05/01 01:50

题意:
在可以行走的区域内,只能转一次90度的弯,问你最长这条路可以多长。
思路:
我们可以看到

/*1238 4765*/

转90度的路径会是横竖,也就是1-3-5-7;
还有斜的:2-4-6-8;
我们可以对一个点直接BFS/暴力一下,方向是八个方向,然后计算对应的90度方向上的距离和,开个数组表示某方向上的路径长度,我们可以发现90度方向在数组上的规律,然后再暴力找个最大。
复杂度也不高。
贴一发挫code…….

//#include<bits/stdc++.h>#include<cstdio>#include<iostream>#include<math.h>#include<string.h>#include<algorithm>using namespace std;typedef long long LL;typedef unsigned long long ULL;const double eps=1e-5;const double pi=acos(-1.0);const int mod=1e8+7;const LL INF=0x3f3f3f3f;const int N=1e2+7;char ma[N][N];int n;int dx[8]={-1,-1,-1,0,1,1,1,0};int dy[8]={-1,0,1,1,1,0,-1,-1};int Judge(int x,int y){    if(x<0||y<0||x>=n||y>=n||ma[x][y]=='#')        return 0;    return 1;}int bfs(int i,int j){    int sum[8];    for(int k=0;k<8;k++)        sum[k]=1;    for(int k=0;k<8;k++)    {        int aa=i+dx[k];        int bb=j+dy[k];        while(Judge(aa,bb)){            sum[k]++;            aa+=dx[k];            bb+=dy[k];        }    }    int ans=0;//    for(int k1=0;k1<8;k1+=2)//        for(int k2=1;k2<8;k2+=2)//            ans=max(ans,sum[k1]+sum[k2]);    for(int k1=0;k1<8;++k1)        for(int k2=0;k2<8;++k2)            if((k1%2==k2%2)&&k1!=k2)    //对于数组的特性,奇数都是斜方向,偶数都是竖直方向。                 ans=max(ans,sum[k1]+sum[k2]);    return ans-1;}int main(){    while(~scanf("%d",&n))    {        if(!n) break;        int i,j,ans;        for(i=0;i<n;i++)            scanf("%s",ma[i]);        ans=0;        for(i=0;i<n;i++)            for(j=0;j<n;j++)                if(ma[i][j]=='.')                    ans=max(ans,bfs(i,j));        printf("%d\n",ans);    }    return 0;}
0 0