hdu 5024 Wang Xifeng's Little Plot
题意就是给贾宝玉跟薛宝钗安排房间,两个房间之间的距离要尽量远 但是宝玉呢有点傻 要求两个房间之间的路
最多只能拐一次弯 且转弯的角度为90°
‘.’表示能走的路 ‘#’表示不能走过的
有一个‘.’就算一个单位的距离
我一开始的思路是 直接枚举起点 然后搜 记录搜的方向 和有木有拐弯 拐弯90°是有两种可能
然后每次取最大值
但是这种思路做了 交了TLE
后来枚举拐点 之间按着两个互相垂直的方向搜索就可以了(90°的方向两种可能 取大值)
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string.h>
#include <string>
#define eps 1e-8
#define op operator
#define MOD 10009
#define MAXN 100100
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define FOV(i,a,b) for(int i=a;i>=b;i--)
#define REP(i,a,b) for(int i=a;i<b;i++)
#define REV(i,a,b) for(int i=a-1;i>=b;i--)
#define MEM(a,x) memset(a,x,sizeof a)
#define ll __int64
using namespace std;
int n;
char mp[110][110];
int dir[8][2]={{-1,-1},{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1}};//八个方向
bool vis[110][110];
int dfs(int x,int y,int d)
{
//cout<<"ddd "<<d<<endl;
x+=dir[d][0]; y+=dir[d][1];
int num=0;
if(mp[x][y]=='#'||(x<0||x>=n||y<0||y>=n))
return num;
if(mp[x][y]=='.')
{
if(vis[x][y]==1)
{
return num;
}
else
{
vis[x][y]=1;
num++;
num+=dfs(x,y,d);
vis[x][y]=0;
}
}
return num;
}
int main()
{
//freopen("ceshi.txt","r",stdin);
while(scanf("%d\n",&n)&&n)
{
// if(n==0) break;
MEM(vis,0);
for(int i=0;i<n;i++)
{
scanf("%s",mp[i]);
}
// mx=-1;
int pp=0;
for(int i=0;i<n;i++)
for(int j=0; j<n; j++)
{
if(mp[i][j]=='#') continue;
MEM(vis,0);
int mx[10];
for(int k=1; k<9; k++)
mx[k]=1;
vis[i][j]=1;
mx[1]+=dfs(i,j,0)+max(dfs(i,j,2),dfs(i,j,6));
mx[2]+=dfs(i,j,1)+max(dfs(i,j,3),dfs(i,j,7));
mx[3]+=dfs(i,j,2)+max(dfs(i,j,0),dfs(i,j,4));
mx[4]+=dfs(i,j,3)+max(dfs(i,j,1),dfs(i,j,5));
mx[5]+=dfs(i,j,4)+max(dfs(i,j,2),dfs(i,j,6));
mx[6]+=dfs(i,j,5)+max(dfs(i,j,3),dfs(i,j,7));
mx[7]+=dfs(i,j,6)+max(dfs(i,j,0),dfs(i,j,4));
mx[8]+=dfs(i,j,7)+max(dfs(i,j,1),dfs(i,j,5));
for(int k=1; k<9; k++)
{
pp=max(pp,mx[k]);
}
}
printf("%d\n",pp);
}
return 0;
}