Java USACO:任务检查器挑战

Java USACO:任务检查器挑战,java,Java,--更新-- 我通过C++重写和提交解决了这个问题。这不完全是最负盛名的方式,但它确实奏效了 --结束更新-- 我正在做USACO检查问题,天哪,我快把头发拔出来了!我有一个解决方案,但对于最后一个测试用例(n=13),它关闭了大约0.3秒。下面的程序有没有办法运行得更快 如果有什么我可以补充的帮助,请让我知道 编辑:程序必须运行我注意到问题归结为枚举除有序序列1到N和N到1(表示对角线)之外的整数1到N的所有排列。有许多关于算法的文本将为您生成排列。用C而不是Java编写 我的处境和你一样,在

--更新--

我通过C++重写和提交解决了这个问题。这不完全是最负盛名的方式,但它确实奏效了

--结束更新--

我正在做USACO检查问题,天哪,我快把头发拔出来了!我有一个解决方案,但对于最后一个测试用例(n=13),它关闭了大约0.3秒。下面的程序有没有办法运行得更快

如果有什么我可以补充的帮助,请让我知道


编辑:程序必须运行我注意到问题归结为枚举除有序序列1到N和N到1(表示对角线)之外的整数1到N的所有排列。有许多关于算法的文本将为您生成排列。

用C而不是Java编写

我的处境和你一样,在花了大约一个小时的时间研究这个问题后,我决定换一种语言

我甚至没有改变我的算法,它运行速度快了10倍

(在您通过挑战后,您可以阅读分析,并查看您还可以进行哪些其他优化。)

我知道这是一个非常晚的答复,您可能早就忘记了这个问题。。。。。。。
:)

根据您的建议,我使用了非递归堆置换生成。结果花了我3.2秒。这可能是因为算法不适合我正在做的搜索类型:你为什么要执行搜索?因为我无法使用公式生成答案。它必须通过某种类型的递归/BFS/迭代深化等来完成。我相信生成置换的算法就足够了:不必再执行进一步的“搜索”,因为我们知道置换是有效的。并非所有置换都是有效的。。。只有一套符合要求。实际上不,我没有。事实上,我确实在C++中重写了这个问题,并且让它被接受了(尽管如此)。C本来会更好,但这是很久以前的事了;)
import java.io.*;
class checker
{
    static int n;
    static boolean ifCol[];
    static boolean rDiag[] = new boolean [26];
    static boolean lDiag[] = new boolean [26];
    static int col[];
    static int print;
    static int counter;
    static PrintWriter out;
    private static void search (int row)
    {
        if (row == n)
        {
            if (print < 3)
            {
                out.print (col [0] + 1);
                for (int i = 1 ; i < n ; i++)
                    out.print (" " + (col [i] + 1));
                out.println ();
                print++;
            }
            counter++;
            return;
        }
        for (int i = 0 ; i < n ; i++)
        {
            if (!ifCol [i] && !rDiag [i - row + 13] && !lDiag [i + row])
            {
                ifCol [i] = rDiag [i - row + 13] = lDiag [i + row] = true;
                col [row] = i;
                search (row + 1);
                ifCol [i] = rDiag [i - row + 13] = lDiag [i + row] = false;
            }

        }
        return;
    }


    public static void main (String[] args) throws IOException
    {
        //long start = System.currentTimeMillis ();
        BufferedReader in = new BufferedReader (new FileReader ("checker.in"));
        out = new PrintWriter (new BufferedWriter (new FileWriter ("checker.out")));
        n = Integer.parseInt (in.readLine ());
        col = new int [n];
        ifCol = new boolean [n];
        search (0);
        out.println (counter);
        //out.println (System.currentTimeMillis()-start);
        out.close ();
        System.exit (0);
    }
}
      Column
1   2   3   4   5   6