递归中Java中的八个皇后

时间:2012-11-25 17:12:32

标签: java

这是我八个女王的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仍然保留数据。感谢任何帮助。

3 个答案:

答案 0 :(得分:0)

“我不知道为什么它会给八次相同的结果”。

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

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

将打印件带到方法外面。

答案 1 :(得分:0)

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

有两种解决方案:

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

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

  3. 我更清楚地发现使用int数组实现的皇后问题,但这是留给每个人的味道。

答案 2 :(得分:0)

由你的递归调用引起的

print();

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