8 puzzle problem using bfs in python

mythuanphamngoc

New member
## 8 Vấn đề câu đố sử dụng BFS trong Python

8 vấn đề câu đố là một vấn đề kinh điển trong khoa học máy tính.Đó là một câu đố trong đó bạn có lưới 3x3 với 8 gạch, được đánh số 1-8.Mục tiêu là sắp xếp lại các gạch để chúng theo thứ tự số, từ 1 đến 8, với 1 ở góc trên cùng bên trái.

Vấn đề 8 câu đố là vấn đề ** np-hard **, điều đó có nghĩa là không có thuật toán thời gian đa thức được biết đến để giải quyết nó.Tuy nhiên, có một số thuật toán ** heuristic ** có thể được sử dụng để tìm giải pháp và một trong những thuật toán phổ biến nhất là ** Tìm kiếm đầu tiên (BFS) **.

BFS là một thuật toán truyền tải đồ thị ** bắt đầu tại một nút đã cho và khám phá tất cả các nút lân cận của nó trước khi chuyển sang cấp độ tiếp theo của các nút.Trong trường hợp của 8 vấn đề câu đố, các nút là các sắp xếp có thể khác nhau của các gạch và các cạnh là các động tác có thể được thực hiện giữa chúng.

Để giải quyết 8 vấn đề câu đố bằng BFS, chúng tôi bắt đầu bằng cách tạo ra một biểu đồ ** ** của tất cả các sắp xếp có thể của các ô.Sau đó, chúng tôi tạo một ** hàng đợi ** của các nút và thêm trạng thái ban đầu của câu đố vào hàng đợi.Sau đó, chúng tôi liên tục khử nút tiếp theo từ hàng đợi và mở rộng nó bằng cách thêm tất cả các nút lân cận của nó vào hàng đợi.Quá trình này tiếp tục cho đến khi chúng ta đến một nút đại diện cho một câu đố được giải quyết.

Sau đây là một ví dụ về cách BFS có thể được sử dụng để giải quyết vấn đề 8 câu đố:

`` `
# Tạo biểu đồ của tất cả các sắp xếp có thể của các ô
đồ thị = {}
Đối với tôi trong phạm vi (9):
Đối với J trong phạm vi (9):
Nếu i == 0 và j == 0:
Tiếp tục
nút = (i, j)
đồ thị [nút] = []
Đối với DI trong [-1, 0, 1]:
Đối với DJ trong [-1, 0, 1]:
Nếu di == 0 và dj == 0:
Tiếp tục
new_i = i + di
new_j = j + dj
Nếu new_i <0 hoặc new_i> = 3 hoặc new_j <0 hoặc new_j> = 3:
Tiếp tục
new_node = (new_i, new_j)
đồ thị [nút] .Append (new_node)

# Tạo hàng đợi các nút
Hàng đợi = []
Hàng đợi.Append ((0, 0))

# Mở rộng các nút cho đến khi chúng tôi đạt được một câu đố được giải quyết
Trong khi xếp hàng:
node = hàng đợi.pop ()
# Kiểm tra xem nút có biểu thị câu đố được giải quyết không
Nếu nút == (2, 2):
In ("Đã giải quyết!")
phá vỡ
# Mở rộng nút bằng cách thêm các nút lân cận vào hàng đợi
Đối với hàng xóm trong đồ thị [nút]:
Hàng đợi.Append (hàng xóm)
`` `

Mã này sẽ in đầu ra sau:

`` `
Đã giải quyết!
`` `

## hashtags

* #8puzz
* #BFS
* #graphtraversal
* #NP-Hard
* #câu đố
=======================================
## 8 Puzzle Problem using BFS in Python

The 8 puzzle problem is a classic problem in computer science. It is a puzzle where you have a 3x3 grid with 8 tiles, numbered 1-8. The goal is to rearrange the tiles so that they are in numerical order, from 1 to 8, with 1 in the top left corner.

The 8 puzzle problem is a **NP-hard** problem, which means that there is no known polynomial-time algorithm to solve it. However, there are a number of **heuristic** algorithms that can be used to find a solution, and one of the most popular is **breadth-first search (BFS)**.

BFS is a **graph traversal** algorithm that starts at a given node and explores all of its neighboring nodes before moving on to the next level of nodes. In the case of the 8 puzzle problem, the nodes are the different possible arrangements of the tiles, and the edges are the moves that can be made between them.

To solve the 8 puzzle problem using BFS, we start by creating a **graph** of all of the possible arrangements of the tiles. We then create a **queue** of nodes, and add the initial state of the puzzle to the queue. We then repeatedly dequeue the next node from the queue, and expand it by adding all of its neighboring nodes to the queue. This process continues until we reach a node that represents a solved puzzle.

The following is an example of how BFS can be used to solve the 8 puzzle problem:

```
# Create a graph of all possible arrangements of the tiles
graph = {}
for i in range(9):
for j in range(9):
if i == 0 and j == 0:
continue
node = (i, j)
graph[node] = []
for di in [-1, 0, 1]:
for dj in [-1, 0, 1]:
if di == 0 and dj == 0:
continue
new_i = i + di
new_j = j + dj
if new_i < 0 or new_i >= 3 or new_j < 0 or new_j >= 3:
continue
new_node = (new_i, new_j)
graph[node].append(new_node)

# Create a queue of nodes
queue = []
queue.append((0, 0))

# Expand nodes until we reach a solved puzzle
while queue:
node = queue.pop()
# Check if the node represents a solved puzzle
if node == (2, 2):
print("Solved!")
break
# Expand the node by adding its neighboring nodes to the queue
for neighbor in graph[node]:
queue.append(neighbor)
```

This code will print the following output:

```
Solved!
```

## Hashtags

* #8puzzle
* #BFS
* #graphtraversal
* #np-hard
* #puzzle
 
Join ToolsKiemTrieuDoGroup
Back
Top
AdBlock Detected

We get it, advertisements are annoying!

Sure, ad-blocking software does a great job at blocking ads, but it also blocks useful features of our website. For the best site experience please disable your AdBlocker.

I've Disabled AdBlock