当前位置:   article > 正文

十四届蓝桥杯省赛Java B组 合并区域_十四届蓝桥javab组,合并区域怎么理解?

十四届蓝桥javab组,合并区域怎么理解?

 

就是将两个矩阵进行拼接,两矩阵可以旋转90 180 270 度。

因为数据比较小,所以这基本上就是一个大的枚举模拟加搜索,直接暴力求解。

  1. import java.io.*;
  2. import java.util.*;
  3. public class Main{
  4. static int n;
  5. static int N = 101;
  6. static int mod = (int)1e9 + 7;
  7. static StreamTokenizer stt = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
  8. static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
  9. static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  10. static int[][] f = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
  11. // static int[][] ff = {{0, -1, 0}, {0, 0, 1}, {0, 1, 0}, {0, 0, -1}, {1, 0, 0}, {-1, 0, 0}};
  12. // static int[] month = {0, 31,28,31,30,31,30,31,31,30,31,30,31};
  13. static int[][] o = new int[N][N];
  14. static int[][] p = new int[N][N];
  15. static int[][] m = new int[3 * N][3 * N];
  16. static int maxi;
  17. private static int dfs(int x, int y) {
  18. int k = 1;
  19. m[x][y] = 0;
  20. for(int i = 0; i < 4; i ++) {
  21. int nx = x + f[i][0], ny = y + f[i][1];
  22. if(nx < 1 || nx > 3 * n || ny < 1 || ny > 3 * n || m[nx][ny] == 0) continue;
  23. k += dfs(nx, ny);
  24. }
  25. return k;
  26. }
  27. private static void draw(int bx, int by, int[][] o2) {
  28. for(int i = bx, ii = 1; ii <= n; ii ++, i ++) {
  29. for(int j = by, jj = 1; jj <= n; jj ++, j ++) {
  30. m[i][j] = o2[ii][jj];
  31. }
  32. }
  33. }
  34. static void asd(int x, int y) throws IOException {
  35. // 在地图上画o矩阵
  36. draw(n + 1, n + 1, o);
  37. // 在地图上画p矩阵
  38. draw(x, y, p);
  39. // 分别枚举o矩阵和p矩阵所有的1进行深搜
  40. for(int i = 1; i <= n; i ++) {
  41. for(int j = 1; j <= n; j ++) {
  42. int nx = i + n, ny = j + n;
  43. if(m[nx][ny] == 1)
  44. maxi = Math.max(maxi, dfs(nx, ny));
  45. }
  46. }
  47. for(int i = 1; i <= n; i ++) {
  48. for(int j = 1; j <= n; j++) {
  49. int nx = i + x - 1, ny = j + y - 1;
  50. if(m[nx][ny] == 1)
  51. maxi = Math.max(maxi, dfs(nx, ny));
  52. }
  53. }
  54. }
  55. private static void sov() throws IOException {
  56. // 在一个三倍大的地图中,枚举p矩阵的坐上角顶点,默认o在中心的n阶矩阵位置
  57. for(int i = 1; i <= 2 * n + 1; i ++) {
  58. asd(1, i);
  59. asd(2 * n + 1, i);
  60. asd(i, 1);
  61. asd(i, 2 * n + 1);
  62. }
  63. }
  64. static void rotate() {
  65. int[][] s = new int[N][N];
  66. for(int i = 1; i <= n; i ++) {
  67. for(int j = 1; j <= n; j ++) {
  68. s[j][n - i + 1] = o[i][j];
  69. }
  70. }
  71. for(int i = 1; i <= n; i ++) {
  72. for(int j = 1; j <= n; j ++) {
  73. o[i][j] = s[i][j];
  74. }
  75. }
  76. }
  77. static void sovle() throws Exception {
  78. n = readInt();
  79. for(int i = 1; i <= n; i ++) {
  80. for(int j = 1; j <= n; j ++) {
  81. o[i][j] = readInt();
  82. }
  83. }
  84. for(int i = 1; i <= n; i ++) {
  85. for(int j = 1; j <= n; j ++) {
  86. p[i][j] = readInt();
  87. }
  88. }
  89. maxi = 0;
  90. // rotate();
  91. // for(int i = 1; i <= n; i ++){
  92. // for(int j = 1; j <= n; j ++) {
  93. // bw.write(o[i][j] + " ");
  94. // }
  95. // bw.write("\n");
  96. // }
  97. for(int i = 0; i < 4; i ++) {
  98. // 旋转o矩阵
  99. rotate();
  100. // 拼接两矩阵求解
  101. sov();
  102. }
  103. bw.write(maxi + "\n");
  104. }
  105. public static void main(String args[]) throws Exception {
  106. int t = 1;
  107. // t = Integer.parseInt(br.readLine());
  108. // t = readInt();
  109. while((t --) > 0) {
  110. // while((n = Integer.parseInt(br.readLine())) != 0) {
  111. sovle();
  112. }
  113. bw.flush();
  114. bw.close();
  115. }
  116. static int readInt() {
  117. try {
  118. stt.nextToken();
  119. } catch (IOException e) {
  120. e.printStackTrace();
  121. }
  122. return (int)stt.nval;
  123. }
  124. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/460900
推荐阅读
相关标签
  

闽ICP备14008679号