这是我八个女王的Java代码。我不知道为什么它会给八次相同的结果。 在此代码中,不包括对角线。
import java.util.*;
class eightTeight {
Set<Integer> s = new HashSet<Integer>();
public void print() {
if (s.size() < 8) {
for (int i = 0; i < 8; i++) {
if (!s.contains(i)) {
s.add(i);
print();
}
}
}
System.out.println(s);
return;
}
}
似乎一旦返回运行,s仍然保留数据。感谢任何帮助。
答案 0 :(得分:0)
“我不知道为什么它会给八次相同的结果”。
因为您以递归方式调用该方法8次,并且每次都打印结果。
for(int i=0;i<8;i++){
if(!s.contains(i)){
s.add(i);
print();
}
}
将打印件带到方法外面。
答案 1 :(得分:0)
在Java中,将对象传递给方法时,将对该对象的引用复制。因此,对该对象的所有引用(包括您在调用方法中保留的对象)都可以看到对该对象所做的更改。
有两种解决方案:
在进行修改之前复制HashSet
,并对副本进行修改。如果找到解决方案,请返回新副本。如果它不起作用,请返回原始副本。
使用数据结构thtat取决于索引,因此您可以忽略所有不应该设置的值。例如一个数组,如果你正在为第五个皇后进行迭代,你可以忽略第五,第六,第七和第八个皇后的值(如果已设置)。
我更清楚地发现使用int数组实现的皇后问题,但这是留给每个人的味道。
答案 2 :(得分:0)
由你的递归调用引起的
print();
你应该意识到JAVA中 没有全局变量 。每次调用“print()”时,只需使用空的“Set”,然后将其添加到其中,然后将其打印出来。这里有八次递归,因此有八次控制台打印出同样的东西。这就是你失败的原因。