zoukankan      html  css  js  c++  java
  • 2014 网选 5024 Wang Xifeng's Little Plot

    题意:从任意一个任意一个可走的点开始找一个最长的路,这条路如果有转弯的话,
    那么必须是 90度,或者没有转弯!

    思路: 首先用dfs将所有可走点开始的 8 个方向上的线段的最长长度求出来 !
    step[i][j][k] 表示的是(i,j)沿着k方向一直走到头或者转弯时的最长步数!
    最后枚举每一个可走点转弯为90度的路径,找到最长的长度!
    step[i][j][k1] + step[i][j][k2] 就是 (i, j)这个点 k1 和 k2方向构成90度!

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #define  N  105
     6 using namespace std;
     7 
     8 int step[N][N][8];
     9 int dir[8][2] = { {0, 1}, {1, 0}, {-1, 0}, {0, -1}, {-1, -1}, {1, 1}, {-1, 1}, {1, -1} };
    10 int index[8][2] = { {0, 1}, {1, 3}, {2, 3}, {0, 2}, {5, 6}, {5, 7}, {4, 7}, {4, 6}};//每一个节点所对应的转弯的枚举 
    11 char mp[N][N], vis[N][N];
    12 int n;
    13 
    14 bool judge(int x, int y){
    15     if(x < 1 || y < 1 || x > n || y > n)
    16         return false;
    17     if( mp[x][y] == '#')  return false;
    18     
    19     return true;
    20 }
    21 
    22 void dfs(int x, int y){
    23     for(int i = 0; i < 8; ++i){
    24         int xx = x + dir[i][1];
    25         int yy = y + dir[i][0];
    26         if(!judge(xx, yy))
    27             step[x][y][i] = 1;
    28         else{
    29             if( !step[xx][yy][i] )//记忆话的赶脚 
    30                 dfs(xx, yy);
    31             step[x][y][i] = 1 + step[xx][yy][i];
    32         }
    33     }
    34 }
    35 
    36 int main(){
    37     while(scanf("%d", &n) && n){
    38         memset(step, 0, sizeof(step));
    39         memset(vis, 0, sizeof(vis));
    40         for(int i = 1; i <= n; ++i)
    41             scanf("%s", mp[i]+1);
    42         
    43         for(int i = 1; i <= n; ++i)
    44             for(int j = 1; j <= n; ++j)
    45                 if(mp[i][j] == '.')
    46                            dfs(i, j);
    47                        
    48         int maxN = -1;                       
    49         for(int i=1; i <= n; ++i)
    50             for(int j = 1; j <= n; ++j){
    51                 if(mp[i][j] == '.')
    52                     for(int k = 0; k < 8; ++k)
    53                         maxN = max(maxN, step[i][j][index[k][0]] + step[i][j][index[k][1]] );
    54             } 
    55         printf("%d
    ", maxN - 1);//因为多加了一次拐点! 
    56     } 
    57     return 0;
    58 } 
    View Code
  • 相关阅读:
    mysql的cmd窗口查看数据库信息
    常见抓包工具
    图形数据库
    支付宝支撑双十一4200万次/秒的数据库请求峰值的技术实现
    处理tomcat内存溢出问题
    maven将jar包打如本地仓库命令
    fastJson去掉指定字段
    mybatis insert 返回主键
    maven引入源码
    mysql实现主从复制
  • 原文地址:https://www.cnblogs.com/hujunzheng/p/3993741.html
Copyright © 2011-2022 走看看