#/*********************************************************** # tetromin.c -- テトロミノの箱詰めパズル #***********************************************************/ Pieces = 5 Col = 5 Row = 8 PieceSize = 4 MaxSymmetry = 8 MaxSite = (Col + 1) * Row - 1 LimSite = (Col + 1) * (Row + 1) $board = [] $name = (0...2).collect{ Array.new(Pieces) } $symmetry = [] $shape = (0...Pieces).collect{(0...MaxSymmetry).collect{Array.new(PieceSize-1)}} $rest = [] def init for site in 0...MaxSite if (site % (Col + 1) == Col) $board[site] = "*" else $board[site] = "" end end for site in MaxSite...LimSite $board[site] = "*" end $board[LimSite - 1] = "" # 番人 line = gets for piece in 0...Pieces $rest[piece] = 2 line =~ /(.)(.)\s+(\d+)/ $name[1][piece] = $1; $name[0][piece] = $2; $symmetry[piece] = $3.to_i line = $' for state in 0...$symmetry[piece] data = line.scan(/\d+/) for site in 0...(PieceSize-1) $shape[piece][state][site] = data.shift.to_i end line = gets end end end $count = 0 def found # 解の表示 printf("\n解 %d\n\n", $count += 1) for i in 0...Col i.step(MaxSite, Col + 1) do |j| printf("%s", $board[j]) end printf("\n") end end def try(site) # 再帰的に試みる for piece in 0...Pieces if ($rest[piece] == 0); next; end $rest[piece] -= 1 for state in 0...$symmetry[piece] s0 = site + $shape[piece][state][0] if ($board[s0] != ""); next; end s1 = site + $shape[piece][state][1] if ($board[s1] != ""); next; end s2 = site + $shape[piece][state][2] if ($board[s2] != ""); next; end $board[site] = $board[s0] = $board[s1] = $board[s2]\ = $name[$rest[piece]][piece] $temp = site while ($board[$temp += 1] != ""); end if ($temp < MaxSite); try($temp); else; found(); end $board[site] = $board[s0] = $board[s1] = $board[s2] = "" end $rest[piece] += 1 end end init(); try(0) exit 0