hdu 5024 暴力枚举



给以个n*n的矩阵地图,‘.’ 能走,‘#’不能走,求一段最长的路 , 这条路最多只能拐一次弯,或者不拐,一个弯是90度 ;

走的方向有8个,东,南,西,北,东南,西南.....    一条路的长度是包含的‘.’的数目 ;



先预处理每个点8个方向能走的最大长度,然后暴力枚举以i点开头能走的最大长度 ,  

注意 ,向左或向右走的时候 ,下一次方向 要么向上或者向下   .    因为要保证最多只能拐一次弯,而且是90度 ;




#include<cstdio>
#include<cstring>
#include<map>
#include<vector>
#include<cmath>
#include<cstdlib>
#include<stack>
#include<queue>
#include <iomanip>
#include<iostream>
#include<algorithm>
using namespace std ;
const int N=110 ;
char g[N][N] ;
int a[N*N][8] ;
int n;
void make(int q , int w)
{
	int tmp=q*n+w;
	for(int i = 0 ; i < 8 ; i++ )
	{   
	   int x=q,y=w;
		if(i==0)
		{
			while(g[x-1][y]=='.'&& x>0 )
			 {  
			    a[tmp][i]++;x--;
			 }
			 a[tmp][i]++;
		}
		else if(i==1)
		{
			while( g[x-1][y+1]=='.' && x>0 && y< (n-1) )
			   {
			    a[tmp][i]++ ; x--;y++;
			   }a[tmp][i]++;
		}
		else if(i==2)
		{
			  while(g[x][y+1]=='.' && y < (n-1))
			    {
			       a[tmp][i]++;y++;
			   }a[tmp][i]++;
		}else if(i==3)
		{
			   while(g[x+1][y+1]=='.' && x <(n-1) && y < (n-1))
			    {
			       a[tmp][i]++;x++,y++;
			    }a[tmp][i]++;
		}else if(i==4)
		{
			   while(g[x+1][y]=='.'&& x < (n-1))
			     {
			     
			     a[tmp][i]++;x++;
			     }a[tmp][i]++;
		}else if(i==5)
		{
			   while(g[x+1][y-1]=='.'&& y > 0 && x < (n-1))
			     {
			        a[tmp][i]++;x++,y--;
			     }a[tmp][i]++;
		}else if(i==6)
		{
			   while(g[x][y-1]=='.'&& y > 0)
			     {
			       a[tmp][i]++;y--;
			      }a[tmp][i]++;
		}else if(i==7)
		{
			   while(g[x-1][y-1]=='.'&& x > 0&& y> 0)
			     {
			        a[tmp][i]++;x--;y--;
			     }a[tmp][i]++;
		}
	}
	
}

int main()
{
	  
	  while(~scanf("%d",&n))
	  {      getchar(); 
	      if(n==0) break;
	  	       for(int i  = 0 ; i < n ; i++)
				 scanf("%s",g[i]) ; 
	  	       memset(a,0,sizeof(a));
	  	       for(int i  = 0 ; i < n ; i++)
	  	          for(int j = 0 ; j < n ; j++)
	  	            {   
	  	            	   if(g[i][j]=='.')
	  	            	   {   //printf("***");
	  	            	   	    int tmp = i*n+j ;
	  	            	   	     make(i,j) ;
									  	  	            	   	     
	  	            	   }
	  	            }
	  	   int sum = 0;
	  	      for( int i = 0 ; i < n ; i++)	  	      
	  	      	  for(int  j = 0 ;  j < n ; j++)
	  	      	  {
	  	      	  	   if(g[i][j]=='.')
	  	      	  	   {
	  	      	  	   	       int tmp = i*n+j ,ans =0;
	  	      	  	   	       for(int k = 0 ; k < 8 ; k++)
	  	      	  	   	       {
	  	      	  	   	       	      if(k==0)
	  	      	  	   	       	      {    
	  	      	  	   	       	           
	  	    int Max = max( a[tmp][k]+a[(i-(a[tmp][k])+1)*n+j][6]-1 ,  
			a[tmp][k]+a[(i-(a[tmp][k])+1)*n+j][2]-1) ;
	  	      	  	   	       	      	  ans = max( ans , Max) ;
	  	      	  	   	       	      }
	  	      	  	   	       	      else if(k==1)
	  	      	  	   	       	      {
	  	    int Max = max( a[tmp][k]+a[(i-(a[tmp][k])+1)*n+j+a[tmp][k]-1][7]-1 ,  
			a[tmp][k]+a[(i-(a[tmp][k])+1)*n+j+a[tmp][k]-1][3]-1) ;
	  	      	  	   	       	      	    ans = max( ans , Max) ;  
	  	      	  	   	       	      }
	  	      	  	   	       	      else if(k==2)
	  	      	  	   	       	      {
	  	    int Max = max( a[tmp][k]+a[i*n+j+a[tmp][k]-1][0]-1 ,  
			a[tmp][k]+a[i*n+j+a[tmp][k]-1][4]-1) ;
	  	      	  	   	       	      	     ans= max( ans , Max) ;
	  	      	  	   	       	      }
	  	      	  	   	       	      else if(k==3)
	  	      	  	   	       	      {
	  	    int Max = max( a[tmp][k]+a[(i+(a[tmp][k])-1)*n+j+a[tmp][k]-1][1]-1 , 
			a[tmp][k]+a[(i+(a[tmp][k])-1)*n+j+a[tmp][k]-1][5]-1 ) ;
	  	      	  	   	       	      	    ans = max( ans , Max) ;  	  	   	       	      	
	  	      	  	   	       	      }
	  	      	  	   	       	      else if(k==4)
	  	      	  	   	       	      {
	  	      	  	   	       	      	      
	  	    int Max = max( a[tmp][k]+a[(i+a[tmp][k]-1)*n+j][6]-1 ,  
			a[tmp][k]+a[(i+a[tmp][k]-1)*n+j][2]-1) ;
	  	      	  	   	       	      	  ans = max( ans , Max) ;
	  	      	  	   	       	      }
	  	      	  	   	       	      else if(k==5)
	  	      	  	   	       	      {
	  	    int Max = max( a[tmp][k]+a[(i+a[tmp][k]-1)*n+j-a[tmp][k]+1][7]-1 ,  
		   a[tmp][k]+a[(i+a[tmp][k]-1)*n+j-a[tmp][k]+1][3]-1) ;
	  	      	  	   	       	      	    ans = max( ans , Max) ; 
	  	      	  	   	       	      }
	  	      	  	   	       	      else if(k==6)
	  	      	  	   	       	      {
	  	 int Max = max( a[tmp][k]+a[i*n+j-a[tmp][k]+1][0]-1 ,  
			a[tmp][k]+a[i*n+j-a[tmp][k]+1][4]-1) ;
	  	      	  	   	       	      	     ans = max( ans, Max) ;
	  	      	  	   	       	      	
	  	      	  	   	       	      }
	  	      	  	   	       	      else if(k==7)
	  	      	  	   	       	      {
	  	int Max = max( a[tmp][k]+a[(i-a[tmp][k]+1)*n+j-a[tmp][k]+1][1]-1 , 
		a[tmp][k]+a[(i-a[tmp][k]+1)*n+j-a[tmp][k]+1][5]-1 ) ;
	  	      	  	   	       	      	     ans = max( ans , Max) ; 
	  	      	  	   	       	      }
	  	      	  	   	       }
	  	      	  	   	       sum = max(ans,sum);
	  	      	  	   }
	  	      	  }   
	  	    
			   	printf("%d\n",sum);
	  }
   return 0;
} 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值