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