hdu5024 网络赛水题

2014-11-24 13:25:54 · 作者: · 浏览: 32

不用多想 暴力撸就行 枚举每个点 向四周延伸的两条最远距离 最多能转一次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
     ; }