题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5024
解题思路:
题目大意:
从图中任何一个点走,最多只能转一个90度的弯,求这个最长路。。。
算法思想:
暴力枚举每个点的8个方向的90度,然后找最大值即可。。。
AC代码:
#include <iostream>
#include <cstdio>
using namespace std;
int n;
char s[105][105];
int dx[] = {-1,-1,0,1,1,1,0,-1},dy[] = {0,-1,-1,-1,0,1,1,1};
bool judge(int x,int y){
return 0 <= x && x < n && 0 <= y && y < n;
}
int solve(int x,int y){
int ans = 0;
for(int i = 0; i < 8; i++)
for(int j = i+1; j < 8;j++)
if(dx[i]*dx[j] + dy[i]*dy[j] == 0){//判断是否垂直
int xx = x + dx[i],yy = y + dy[i];
int x1 = x + dx[j],y1 = y + dy[j];
int res = 1;
while(judge(xx,yy) && s[xx][yy] == '.'){
res++;
xx += dx[i];
yy += dy[i];
}
while(judge(x1,y1) && s[x1][y1] == '.'){
res++;
x1 += dx[j];
y1 += dy[j];
}
ans = max(res,ans);
}
return ans;
}
int main(){
while(scanf("%d",&n),n){
for(int i = 0; i < n; i++)
scanf("%s",s[i]);
int ans = 0;
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
if(s[i][j] == '.')
ans = max(ans,solve(i,j));
}
}
printf("%d\n",ans);
}
return 0;
}
另附一神牛代码(是用递推做的):
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 105;
char g[maxn][maxn];
int n,dp[maxn][maxn][10];
void init (){
memset(dp, 0, sizeof(dp));
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
if(g[i][j] == '#')
continue;
dp[i][j][0] = dp[i][j-1][0] + 1;
dp[i][j][1] = dp[i-1][j][1] + 1;
dp[i][j][2] = dp[i-1][j-1][2] + 1;
dp[i][j][3] = dp[i-1][j+1][3] + 1;
}
}
for(int i = n; i; i--){
for(int j = n; j; j--){
if(g[i][j] == '#')
continue;
dp[i][j][4] = dp[i][j+1][4] + 1;
dp[i][j][5] = dp[i+1][j][5] + 1;
dp[i][j][6] = dp[i+1][j+1][6] + 1;
dp[i][j][7] = dp[i+1][j-1][7] + 1;
}
}
}
int solve (){
int ret = 0;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
ret = max(ret, max(dp[i][j][0], dp[i][j][4]) + max(dp[i][j][1], dp[i][j][5]) - 1);
ret = max(ret, max(dp[i][j][2], dp[i][j][6]) + max(dp[i][j][3], dp[i][j][7]) - 1);
}
}
return ret;
}
int main (){
while (scanf("%d",&n),n){
for(int i = 1; i <= n; i++)
scanf("%s",g[i]+1);
init();
printf("%d\n",solve());
}
return 0;
}