首页 > 代码库 > 2014 网选 5024 Wang Xifeng's Little Plot
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\n", maxN - 1);//因为多加了一次拐点! 56 } 57 return 0;58 }
2014 网选 5024 Wang Xifeng's Little Plot
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。