题目大意:给出一个图,只能在图上拐一次弯,而且必须是90度,问求最长路
分析:暴力dfs。枚举所有可以走的点。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 111;
char g[maxn][maxn];
int dx[8] = {0, 1, 0, -1, 1, 1, -1, -1};
int dy[8] = {1, 0, -1, 0, -1, 1, 1, -1};
int n;
int ans;
void dfs(int x, int y) {
int a[8] = {0};
for(int i = 0; i < 8; i++) {
int j = 1;
while(true) {
int tx = x+dx[i]*j;
int ty = y+dy[i]*j;
if(g[tx][ty] == '.')
a[i]++;
else break;
j++;
}
}
for(int i = 0; i < 8; i++) {
for(int j = 0; j < 8; j++) {
if(i != j) {
if((i < 4 && j < 4) || (i >=4 && j >= 4))
ans = max(ans, a[i]+a[j]+1); //加上交叉的那个点
}
}
}
}
int main() {
while(scanf("%d", &n) && n) {
memset(g, '#', sizeof(g));
for(int i = 1; i <= n; i++) {
getchar();
for(int j = 1; j <= n; j++)
scanf("%c", &g[i][j]);
}
ans = 0;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
if(g[i][j] == '.')
dfs(i, j);
printf("%d\n", ans);
}
return 0;
}