题目链接: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