题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5024
3 #.# ##. ..# 3 ... ##. ..# 3 ... ### ..# 3 ... ##. ... 0
3 4 3 5
题意:
在一个给定的图中,‘.’代表可行路,‘#’是不可行的,问在最多有一个90度的转弯的路径中最远的两点的距离!
思路:
暴力枚举每一点的八个方向的可行路的距离,由于只能是90度的转弯,所以我们把八个方向分为两次枚举!这样就可以保证是90度了!枚举每一个‘.’的可行路径后再把其中的最远的两条路径相加减一即可!(也就是枚举每一点作为转弯的那一点)。
代码如下:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>
#define MAXN 117
using namespace std;
char mm[MAXN][MAXN];
int k;
int xx[8]= {0,1,0,-1,-1,1,1,-1};
int yy[8]= {1,0,-1,0,1,1,-1,-1};
int main()
{
    int n;
    int re1[8],re2[8];
    while(~scanf("%d",&n) && n)
    {
        memset(mm,0,sizeof(mm));
        int maxx = -1;
        for(int i = 0; i < n; i++)
        {
            scanf("%s",mm[i]);
        }
        for(int i = 0; i < n; i++)
        {
            for(int j = 0; j < n; j++)
            {
                memset(re1,0,sizeof(re1));
                if(mm[i][j] == '.')
                {
                    for(int l = 0; l < 4; l++)
                    {
                        int t1 = i, t2 = j;
                        while(1)
                        {
                            if(mm[t1][t2]=='.')
                            {
                                re1[l]++;
                            }
                            else
                                break;
                            t1+=xx[l], t2+=yy[l];
                        }
                    }
                    sort(re1,re1+4);
                    if(re1[2]+re1[3]> maxx)
                        maxx = re1[2]+re1[3];
                }
            }
        }
        for(int i = 0; i < n; i++)
        {
            for(int j = 0; j < n; j++)
            {
                memset(re2,0,sizeof(re2));
                if(mm[i][j] == '.')
                {
                    for(int l = 4; l < 8; l++)
                    {
                        int t1 = i, t2 = j;
                        while(1)
                        {
                            if(mm[t1][t2]=='.')
                            {
                                re2[l-4]++;
                            }
                            else
                                break;
                            t1+=xx[l], t2+=yy[l];
                        }
                    }
                    sort(re2,re2+4);
                    if(re2[2]+re2[3]> maxx)
                        maxx = re2[2]+re2[3];
                }
            }
        }
        printf("%d\n",maxx-1);
    }
    return 0;
}
HDU 5024 Wang Xifeng's Little Plot(暴力枚举+瞎搞)
原文地址:http://blog.csdn.net/u012860063/article/details/39433881