visited.add(state)这行代码出现了TypeError: unhashable type: 'list'的错误要怎么改
时间: 2024-02-11 11:09:18 浏览: 93
这个错误通常出现在使用了不可哈希(unhashable)的数据类型作为集合的元素时。在这个错误信息中,出现了'list',说明你在将一个列表作为集合的元素来使用。而列表是可变对象,不能被哈希,所以会出现这个错误。
如果你想要将列表作为集合的元素,可以将列表转换成元组(tuple),因为元组是不可变对象,是可以被哈希的。可以将代码修改为:
```
visited.add(tuple(state))
```
这样就可以避免这个错误了。
相关问题
代码报错Exception in thread "main" java.lang.StackOverflowError at home.rc.dfs(rc.java:29) at home.rc.dfs(rc.java:51)请修改代码
这个错误是由于递归调用dfs()方法时,栈空间不足而导致的。我们可以通过增加栈空间的方式来解决这个问题。
修改方法如下:
在执行程序时,增加栈空间的大小,例如:
```
java -Xss4m RiverCrossingProblem
```
这将增加栈空间的大小为4MB。
另外,注意在dfs()方法中,如果当前状态已经存在于已访问的状态中,则不再递归调用dfs()方法,避免重复搜索。
修改后的代码如下:
```
import java.util.*;
public class RiverCrossingProblem {
static final int WOLF = 1;
static final int SHEEP = 2;
static final int VEGETABLES = 3;
static final int EMPTY = 0;
static final int LEFT = 0;
static final int RIGHT = 1;
static final int[][] STATE = { { 0, 0, 0 }, { WOLF, SHEEP, VEGETABLES } };
static boolean isValid(int[] state) {
if (state[WOLF] == state[SHEEP] && state[WOLF] != state[EMPTY])
return false;
if (state[SHEEP] == state[VEGETABLES] && state[SHEEP] != state[EMPTY])
return false;
return true;
}
static boolean isFinalState(int[] state) {
return Arrays.equals(state, STATE[1]);
}
static void dfs(int[] state, int side, List<String> solution, Set<String> visited) {
if (!isValid(state))
return;
if (isFinalState(state))
return;
String key = Arrays.toString(state) + side;
if (visited.contains(key))
return;
visited.add(key);
int[] newState = new int[state.length];
for (int i = 0; i < state.length; i++) {
if (state[i] == side) {
newState = Arrays.copyOf(state, state.length);
newState[i] = 1 - side;
String action = "";
switch (i) {
case WOLF:
action = "wolf";
break;
case SHEEP:
action = "sheep";
break;
case VEGETABLES:
action = "vegetables";
break;
}
solution.add(action + " -> " + (side == LEFT ? "right" : "left"));
dfs(newState, 1 - side, solution, visited);
if (isFinalState(newState))
return;
solution.remove(solution.size() - 1);
}
}
}
public static void main(String[] args) {
int[] state = { WOLF, SHEEP, VEGETABLES, 1 };
List<String> solution = new ArrayList<>();
Set<String> visited = new HashSet<>();
dfs(state, 1, solution, visited);
for (String step : solution) {
System.out.println(step);
}
}
}
```
在dfs()方法中,增加了一个Set<String>类型的visited,用于存储已经访问过的状态。在递归调用dfs()方法之前,先检查当前状态是否已经存在于visited集合中,如果是,则不再递归调用dfs()方法。
这样做可以避免重复搜索,从而减少栈空间的使用,避免StackOverflowError错误。
import heapqclass Graph: def __init__(self, vertices): self.vertices = vertices self.adjacency_list = {v: [] for v in vertices} def add_edge(self, u, v, weight): self.adjacency_list[u].append((v, weight)) self.adjacency_list[v].append((u, weight)) def dijkstra(self, source): heap = [(0, source)] visited = set() shortest_distances = {v: float('inf') for v in self.vertices} shortest_distances[source] = 0 while heap: (dist, current_vertex) = heapq.heappop(heap) if current_vertex in visited: continue visited.add(current_vertex) for (neighbor, weight) in self.adjacency_list[current_vertex]: distance = dist + weight if distance < shortest_distances[neighbor]: shortest_distances[neighbor] = distance heapq.heappush(heap, (distance, neighbor)) for v in self.vertices: print(f"{source}->{v}的最短路径为:{v} 长度:{shortest_distances[v]}")# 测试代码vertices = ['A', 'B', 'C', 'D', 'E']graph = Graph(vertices)graph.add_edge('A', 'B', 6)graph.add_edge('A', 'D', 1)graph.add_edge('B', 'C', 5)graph.add_edge('B', 'D', 2)graph.add_edge('B', 'E', 2)graph.add_edge('C', 'E', 5)graph.add_edge('D', 'E', 1)graph.dijkstra('A')
这是一个使用 Dijkstra 算法求解最短路径的代码。假设有一个无向图,使用字典 `adjacency_list` 存储每个顶点的邻接表。在 `dijkstra` 方法中,首先将起始顶点放入堆中,然后使用 `visited` 集合记录已经访问过的顶点。使用字典 `shortest_distances` 记录每个顶点到起始顶点的最短距离,初始值为正无穷。当从堆中弹出一个顶点时,如果该顶点已经被访问过,则直接跳过。否则遍历该顶点的所有邻居,计算它们到起始顶点的距离,并更新 `shortest_distances` 和堆。最后,打印出起始顶点到每个顶点的最短路径长度。
代码中给出了一个简单的测试例子,使用节点 A、B、C、D、E 构建一个无向图,并从起点 A 开始求解最短路径。
阅读全文