Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public final class QueenTemplate {
- private QueenTemplate() {
- }
- public static void main(String[] args) throws Exception{
- int n = 14;
- PrintStream out = new PrintStream(new FileOutputStream(new File("QueenUnrolled.java")));
- out.print(
- "public class QueenUnrolled {\n" +
- " public static void main(String[] args) {\n" +
- " qq();\n" +
- " qq();\n" +
- " qq();\n" +
- " qq();\n" +
- " qq();\n" +
- " }\n" +
- '\n' +
- " private static void qq() {\n" +
- " long start = System.currentTimeMillis();\n" +
- " long res = calcQueens();\n" +
- " System.out.println(\"res = \" + res+\", \"+(System.currentTimeMillis()-start));\n" +
- " }\n" +
- '\n' +
- " private static long calcQueens() {\n" +
- " return queens_0(new int["+n+"]);\n" +
- " }\n");
- printSource(n, out);
- out.print("}\n");
- out.close();
- }
- private static void printSource(int n, PrintStream out) {
- for(int m = 0; m < n; m++) {
- for(int k = 0; k < n; k++) {
- out.print(getGood(n, m,k));
- }
- }
- for(int m = 0; m < n; m++) {
- String val = getQueen(n, m);
- out.print(val);
- }
- }
- private static String getQueen(int n, int m) {
- StringBuilder sb = new StringBuilder();
- sb.append(" private static long queens_").append(m).append("(int[] qs) {\n");
- sb.append(" long result = 0;\n");
- for(int k = 0; k < n; k++) {
- sb.append(" if(good_").append(m).append('_').append(k).append("(qs)) {\n");
- if(m == n-1) {
- sb.append(" result += 1;\n");
- } else {
- sb.append(" qs[").append(m).append("] = ").append(1 << k).append(";\n");
- sb.append(" result += queens_").append(m + 1).append("(qs);\n");
- }
- sb.append(" }\n");
- }
- sb.append(" return result;\n");
- sb.append(" }\n\n");
- return sb.toString();
- }
- private static String getGood(int n, int m, int k) {
- StringBuilder sb = new StringBuilder();
- sb.append(" public static boolean good_").append(m).append('_').append(k).append("(int[] qs) {\n");
- if(m == 0) {
- sb.append(" return true;\n");
- } else {
- sb.append(" return ");
- boolean first = true;
- for(int i = 0; i < m; i++) {
- int mask = 0;
- if(k - i + m >= 0 && k - i + m < n){
- mask+= 1<<(k - i + m);
- }
- if(k + i - m >= 0 && k + i - m < n){
- mask+= 1<<(k + i - m);
- }
- if(k >= 0 && k < n){
- mask+= 1<<k;
- }
- if(mask!=0) {
- if(!first) sb.append(" && ");
- first = false;
- sb.append("(qs[").append(i).append("] & ").append(mask).append(") == 0 ");
- }
- }
- sb.append(";\n");
- }
- sb.append(" }\n\n");
- return sb.toString();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement