Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python의 주어진 행렬에서 고유한 섬 모양의 수를 찾는 프로그램

<시간/>

2차원 이진 행렬이 있다고 가정하고 주어진 행렬에서 고유한 섬의 수를 찾아야 합니다. 여기서 1은 육지를 나타내고 0은 물을 나타내므로 섬은 주변이 물로 둘러싸여 있는 1의 집합입니다. 모양이 다른 두 개의 섬은 고유합니다.

따라서 입력이 다음과 같으면

1 0 0 0 0
1 0 1 0 1
0 1 1 0 1
0 0 1 0 0
1 0 0 0 0
1 1 0 1 1

그러면 출력은 4가 됩니다(별도의 섬은 다른 색상으로 표시됨).

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • dfs() 함수를 정의합니다. i, j, k, l

  • 매트[i, j] :=0

  • 모양 끝에 쌍(i − k, j − l) 삽입

  • i + 1

    • dfs(i + 1, j, k, l)

  • j + 1

    • dfs(i, j + 1, k, l)

  • i − 1>=0이고 mat[i − 1, j]가 1이면

    • dfs(i − 1, j, k, l)

  • j − 1>=0이고 mat[i, j − 1]이 1이면

    • dfs(i, j − 1, k, l)

  • 주요 방법에서 다음을 수행하십시오 -

  • cnt :=0

  • 모양 :=새로운 세트

  • 매트의 행 수까지 범위 0에 있는 i에 대해

    • mat의 열 개수까지 범위 0의 j에 대해

      • mat[i, j]가 1이면

        • 모양 :=새 목록

        • dfs(i, j, i, j)

        • 모양이 모양에 없으면

          • cnt :=cnt + 1

        • 도형에 도형 삽입

  • 반환 cnt

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

예시

class Solution:
   def solve(self, mat):
      def dfs(i, j, k, l):
         mat[i][j] = 0
         shape.append((i − k, j − l))
      if i + 1 < len(mat) and mat[i + 1][j]:
         dfs(i + 1, j, k, l)
      if j + 1 < len(mat[0]) and mat[i][j + 1]:
         dfs(i, j + 1, k, l)
      if i − 1 >= 0 and mat[i − 1][j]:
         dfs(i − 1, j, k, l)
      if j − 1 >= 0 and mat[i][j − 1]:
         dfs(i, j − 1, k, l)
   cnt = 0
   shapes = set()
      for i in range(len(mat)):
         for j in range(len(mat[0])):
            if mat[i][j]:
               shape = []
               dfs(i, j, i, j)
               shape = tuple(shape)
               if shape not in shapes:
                  cnt += 1
                  shapes.add(shape)
      return cnt
ob = Solution()
matrix = [
   [1, 0, 0, 0, 0],
   [1, 0, 1, 0, 1],
   [0, 1, 1, 0, 1],
   [0, 0, 1, 0, 0],
   [1, 0, 0, 0, 0],
   [1, 1, 0, 1, 1]
]
print(ob.solve(matrix))

입력

[
   [1, 0, 0, 0, 0],
   [1, 0, 1, 0, 1],
   [0, 1, 1, 0, 1],
   [0, 0, 1, 0, 0],
   [1, 0, 0, 0, 0],
   [1, 1, 0, 1, 1]
]

출력

4