不用多想 暴力撸就行 枚举每个点 向四周延伸的两条最远距离 最多能转一次90度的弯
#include#include #include using namespace std ; int dir [8 ][2 ]={0 ,1 , 0 ,-1 , 1 ,0 , -1 ,0 , 1 ,1 , 1 ,-1 , -1 ,1 , -1 ,-1 }; int xia [8 ][2 ]={1 ,0 , -1 ,0 , 0 ,-1 , 0 ,1 , 1 ,-1 , -1 ,-1 , 1 ,1 , -1 ,1 };//是对应的 int n ; char map [110 ][110 ]; int change (int x ,int y ,int k ,int s ) { int mark =0 ; while(1 ) { int xx ,yy ; if(x <0 ||x >=n ||y <0 ||y >=n ) break; if(map [x ][y ]=='#' ) break; mark ++; if(s ==1 ) { xx =x +dir [k ][0 ]; yy =y +dir [k ][1 ]; } else { xx =x +xia [k ][0 ]; yy =y +xia [k ][1 ]; } x =xx ; y =yy ; } return mark ; } int main() { int i ,j ; while(~scanf ("%d" ,&n ),n ) { for(i =0 ;i <n ;i ++) scanf ("%s" ,map [i ]); int Max =0 ; for(i =0 ;i <n ;i ++) { for(j =0 ;j <n ;j ++) { if(map [i ][j ]=='#' ) continue; for(int k =0 ;k <8 ;k ++) { int xx =i +dir [k ][0 ]; int yy =j +dir [k ][1 ]; int xxx =i +xia [k ][0 ]; int yyy =j +xia [k ][1 ]; int kk =1 ; kk +=change (xx ,yy ,k ,1 ); kk +=change (xxx ,yyy ,k ,2 ); if(kk >Max ) Max =kk ; } } } printf ("%d\n" ,Max ); } return 0 ; }