fork download
  1. /* package whatever; // don't place package name! */
  2.  
  3. import java.util.*;
  4. import java.lang.*;
  5. import java.io.*;
  6.  
  7. /* Name of the class has to be "Main" only if the class is public. */
  8. class Ideone
  9. {
  10. public static int check(int row, int col, char [][] lab, int [][] visited, ArrayDeque <Integer> plan){//находим количество стен рядом с каждой клеткой
  11. int empty = 0;//пустые клетки
  12. if(visited[row][col]!=1){
  13. if(lab[row+1][col]=='.'){//проверяем нижнюю клетку
  14. empty++;
  15. if(visited[row+1][col]!=1){
  16. plan.offer(row+1);
  17. plan.offer(col);
  18. }
  19. }
  20. if(lab[row-1][col]=='.'){//проверяем верхнюю клетку
  21. empty++;
  22. if(visited[row-1][col]!=1){
  23. plan.offer(row-1);
  24. plan.offer(col);
  25. }
  26. }
  27. if(lab[row][col+1]=='.'){//проверяем правую клетку
  28. empty++;
  29. if(visited[row][col+1]!=1){
  30. plan.offer(row);
  31. plan.offer(col+1);
  32. }
  33. }
  34. if(lab[row][col-1]=='.'){//проверяем левую клетку
  35. empty++;
  36. if(visited[row][col-1]!=1){
  37. plan.offer(row);
  38. plan.offer(col-1);
  39. }
  40. }
  41. visited[row][col]=1;//отмечаем, что клетка пройдена
  42. return 4-empty;//количество стен рядом с клеткой
  43. }
  44. return 0;
  45. }
  46.  
  47.  
  48. public static void main (String[] args) throws java.lang.Exception
  49. {
  50. Scanner in = new Scanner(System.in);
  51.  
  52. int N = in.nextInt();
  53. char [][] lab = new char [N+2][];
  54. int [][] visited = new int [N+2][];
  55. for(int i=0; i<N+2; i++){
  56. lab[i] = new char [N+2];
  57. visited[i] = new int [N+2];
  58. for(int j=0; j<N+2; j++){
  59. visited[i][j] = 0;//массив для проверки посещённости клеток
  60. if(i==0||i==N+1||j==0||j==N+1){
  61. lab[i][j]='*';//вокруг данного лабиринта делаем стену
  62. }
  63. }
  64. }
  65. String line;
  66. for(int i=1; i<N+1; i++){
  67. line = in.next();
  68. for(int j=1; j<N+1; j++){
  69. lab[i][j]=line.charAt(j-1);//заполняем лабиринт
  70. }
  71. }
  72.  
  73. ArrayDeque <Integer> plan = new ArrayDeque<Integer>();
  74. plan.offer(1);//начинаем считать с левой верхней клетки
  75. plan.offer(1);
  76. int walls=0;
  77. while(!plan.isEmpty()){
  78. int row=plan.poll();
  79. int col=plan.poll();
  80. walls+=check(row, col, lab, visited, plan);
  81. }
  82. if(visited[N][N]!=1){//если не попали в правую нижнюю клетку
  83. plan.offer(N);//считаем начиная с неё
  84. plan.offer(N);
  85. while(!plan.isEmpty()){
  86. int row=plan.poll();
  87. int col=plan.poll();
  88. walls+=check(row, col, lab, visited, plan);
  89. }
  90. }
  91. walls-=4;//стены у левого верхнего и правого нижнего угла отсутствуют
  92. int meters = walls * 9;
  93. System.out.println(meters);
  94. }
  95. }
Success #stdin #stdout 0.15s 321344KB
stdin
5
.....
...##
..#..
..###
.....
stdout
198