0

这是我的八皇后的 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;
    }
}

似乎一旦 return 运行, s 仍然保留数据。感谢任何帮助。

4

3 回答 3

0

它是由您的递归调用引起的

print();

你应该意识到JAVA中没有全局变量。每次调用“print()”时,只会使用空的“Set”,然后将 sth 添加到其中,然后将其打印出来。这里有八次递归,因此控制台有八次打印出同样的东西。这就是为什么你辜负了期望。

于 2012-11-25T18:43:25.657 回答
0

“我不知道为什么它会连续八次获得相同的结果”。

因为您递归地调用该方法 8 次,并且每次都打印结果。

for(int i=0;i<8;i++){
            if(!s.contains(i)){
                s.add(i);
                print();
            }
        }

将打印带到方法之外。

于 2012-11-25T17:15:53.170 回答
0

在 Java 中,当您将对象传递给方法时,您复制了对该对象的引用。因此,对该对象的所有引用(包括您在调用方法中保留的引用)都可以看到对该对象所做的更改。

有两种解决方案:

  1. 复制HashSet之前的修改,并对副本进行修改。如果找到解决方案,请返回新副本。如果它不起作用,请退回原件。

  2. 使用依赖于索引的数据结构,因此您可以忽略所有不应设置的值。例如一个数组,如果你正在迭代第五个皇后,你可以忽略第五个、第六个、第七个和第八个皇后的值(如果它们已设置)。

我发现用 int 数组实现的皇后问题更清楚,但这留给每个人的口味。

于 2012-11-25T17:17:15.520 回答