File: nqueen_java_seq.java

package info (click to toggle)
smlsharp 4.1.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 123,732 kB
  • sloc: ansic: 16,725; sh: 4,347; makefile: 2,191; java: 742; haskell: 493; ruby: 305; cpp: 284; pascal: 256; ml: 255; lisp: 141; asm: 97; sql: 74
file content (90 lines) | stat: -rw-r--r-- 2,398 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
class NqueenJavaSeq {

    static int repeat = 10;
    static int size = 14;
    static int cutOff = 7;

    static class Board {
        int queens, limit, left, down, right, kill;
    }

    static Board init(int width) {
        Board b = new Board();
        b.queens = width;
        b.limit = 1 << width;
        b.left = 0;
        b.down = 0;
        b.right = 0;
        b.kill = 0;
        return b;
    }

    static Board put(Board b, int bit) {
        Board r = new Board();
        r.queens = b.queens - 1;
        r.limit = b.limit;
        r.left = (b.left | bit) >> 1;
        r.down = b.down | bit;
        r.right = (b.right | bit) << 1;
        r.kill = r.left | r.down | r.right;
        return r;
    }

    static int ssum(Board board, int bit) {
        int sum = 0;
        while (bit < board.limit) {
            if ((board.kill & bit) == 0)
                sum += solve(put(board, bit));
            bit <<= 1;
        }
        return sum;
    }

    static int psum(Board board, int bit) {
        while (bit < board.limit) {
            if ((board.kill & bit) == 0) {
                int t = solve(put(board, bit));
                int n = psum(board, bit << 1);
                return n + t;
            }
            bit <<= 1;
        }
        return 0;
    }

    static int solve(Board board) {
        if (board.queens == 0) {
            return 1;
        } else if (board.queens <= cutOff) {
            return ssum(board, 1);
        } else {
            return psum(board, 1);
        }
    }

    static int doit() {
        return solve(init(size));
    }

    static void rep() {
        for (int i = 0; i < repeat; i++) {
            long t1 = System.currentTimeMillis();
            int r = doit();
            long t2 = System.currentTimeMillis();
            System.out.println(" - {result: " + r + ", time: "
                               + (double)(t2 - t1) / 1000.0 + "}");
        }
    }

    public static void main(String[] args) {
        if (args.length > 0) repeat = Integer.parseInt(args[0]);
        if (args.length > 1) size = Integer.parseInt(args[1]);
        if (args.length > 2) cutOff = Integer.parseInt(args[2]);
        System.out.println(" bench: nqueen_java_seq");
        System.out.println(" size: " + size);
        System.out.println(" cutoff: " + cutOff);
        System.out.println(" results:");
        rep();
    }

}