summaryrefslogtreecommitdiff
path: root/benchmark/app_pentomino.yml
blob: cda6785a64d50b27f2098e195a67a14b94f0c367 (plain)
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
prelude: |
benchmark:
  app_pentomino: |
    # This program is contributed by Shin Nishiyama
    # modified by K.Sasada

    NP = 5
    ROW = 8 + NP
    COL = 8

    $p = []
    $b = []
    $no = 0

    def piece(n, a, nb)
      nb.each{|x|
        a[n] = x
        if n == NP-1
          $p << [a.sort]
        else
          nbc=nb.dup
          [-ROW, -1, 1, ROW].each{|d|
            if x+d > 0 and not a.include?(x+d) and not nbc.include?(x+d)
              nbc << x+d
            end
          }
          nbc.delete x
          piece(n+1,a[0..n],nbc)
        end
      }
    end

    def kikaku(a)
      a.collect {|x| x - a[0]}
    end
    def ud(a)
      kikaku(a.collect {|x| ((x+NP)%ROW)-ROW*((x+NP)/ROW) }.sort)
    end
    def rl(a)
      kikaku(a.collect {|x| ROW*((x+NP)/ROW)+ROW-((x+NP)%ROW)}.sort)
    end
    def xy(a)
      kikaku(a.collect {|x| ROW*((x+NP)%ROW) + (x+NP)/ROW }.sort)
    end

    def mkpieces
      piece(0,[],[0])
      $p.each do |a|
        a0 = a[0]
        a[1] = ud(a0)
        a[2] = rl(a0)
        a[3] = ud(rl(a0))
        a[4] = xy(a0)
        a[5] = ud(xy(a0))
        a[6] = rl(xy(a0))
        a[7] = ud(rl(xy(a0)))
        a.sort!
        a.uniq!
      end
      $p.uniq!.sort! {|x,y| x[0] <=> y[0] }
    end

    def mkboard
      (0...ROW*COL).each{|i|
        if i % ROW >= ROW-NP
          $b[i] = -2
        else
          $b[i] = -1
        end
        $b[3*ROW+3]=$b[3*ROW+4]=$b[4*ROW+3]=$b[4*ROW+4]=-2
      }
    end

    def pboard
      return # skip print
      print "No. #$no\n"
      (0...COL).each{|i|
        print "|"
        (0...ROW-NP).each{|j|
          x = $b[i*ROW+j]
          if x < 0
            print "..|"
          else
            printf "%2d|",x+1
          end
        }
        print "\n"
      }
      print "\n"
    end

    $pnum=[]
    def setpiece(a,pos)
      if a.length == $p.length then
        $no += 1
        pboard
        return
      end
      while $b[pos] != -1
        pos += 1
      end
      ($pnum - a).each do |i|
        $p[i].each do |x|
          f = 0
          x.each{|s|
            if $b[pos+s] != -1
              f=1
              break
            end
          }
          if f == 0 then
            x.each{|s|
              $b[pos+s] = i
            }
            a << i
            setpiece(a.dup, pos)
            a.pop
            x.each{|s|
              $b[pos+s] = -1
            }
          end
        end
      end
    end

    mkpieces
    mkboard
    $p[4] = [$p[4][0]]
    $pnum = (0...$p.length).to_a
    setpiece([],0)
loop_count: 1