Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- dofile("SAT-solver-framework.lua")
- rows = 20
- cols = 10
- steps = 15
- vrows = rows + 4 + 4
- vcols = cols + 6
- vrow_offset = 4
- vcol_offset = 3
- NewVar("playingfield", {steps + 1, vrows, vcols})
- NewVar("piece_type_bin", {steps, 3})
- NewVar("piece_type", {steps, 7})
- NewVar("new_block_path", {steps, vrows, vcols})
- NewVar("new_block_path_vcon", {steps, vrows, vcols})
- NewVar("final_col_bin", {steps,5})
- NewVar("final_col", {steps,vcols})
- NewVar("final_row_bin", {steps,5})
- NewVar("final_row", {steps,vrows})
- NewVar("intermediate_playingfield", {steps, vrows, vcols})
- NewVar("delete_row", {steps,vrows})
- NewVar("connected_deleted_rows", {steps, vrows, 4})
- NewVar("move_row_down_by", {steps, vrows, 4})
- NewVar("dont_move_row", {steps,vrows})
- local helper_count = 0
- prefilled_field = {
- --row 1 to 5
- {0,0,0,0,0,0,0,0,0,0},
- {0,0,0,0,0,0,0,0,0,0},
- {0,0,0,0,0,0,0,0,0,0},
- {0,0,0,0,0,0,0,0,0,0},
- {0,0,0,0,0,0,0,0,0,0},
- --row 6 to 10
- {0,0,0,0,0,0,0,0,0,0},
- {0,0,0,0,0,0,0,0,0,0},
- {0,0,0,0,0,0,0,0,0,0},
- {0,0,0,0,0,0,0,0,0,0},
- {0,0,0,0,0,0,0,0,0,0},
- --row 11 to 15
- {0,0,0,0,0,0,0,0,0,0},
- {0,0,0,0,0,0,0,0,0,0},
- {0,0,0,0,0,0,0,0,0,0},
- {0,0,0,0,0,0,0,0,0,0},
- {0,0,1,1,0,0,0,0,0,0},
- --row 16 to 20
- {0,0,1,1,0,0,0,0,0,0},
- {1,1,0,0,1,1,0,0,1,1},
- {1,1,0,0,1,1,0,0,1,1},
- {0,0,0,0,0,0,1,1,0,0},
- {0,0,0,0,0,0,1,1,0,0}
- }
- -- initialization for very first step
- for r = 1, rows do
- local b
- for c = 1, cols do
- if prefilled_field[r][c]==1 then b = true else b = false end
- AddSimpleClause{Var.playingfield[1][r + vrow_offset][c + vcol_offset], b}
- end
- end
- for r = 1, vrows do
- for c = 1, vcol_offset do
- AddSimpleClause{Var.playingfield[1][r][c], true}
- end
- -- should be possible, but there are some bugs
- -- left which do render this impossible...
- -- for c = vcol_offset + 1, cols + vcol_offset do
- -- AddSimpleClause{Var.playingfield[1][r][c], false}
- -- end
- for c = cols + vcol_offset + 1, vcols do
- AddSimpleClause{Var.playingfield[1][r][c], true}
- end
- end
- for r = rows + vrow_offset + 1, vrows do
- for c = 1, vcols do
- AddSimpleClause{Var.playingfield[1][r][c], true}
- end
- end
- -- now a REALLY large loop!!
- ------------------------------------------------------
- ------------------------------------------------------
- ------------------------------------------------------
- ---- ----
- ---- ----
- ---- ----
- ---- LARGE LOOP START ----
- ---- ----
- ---- ----
- ---- ----
- ------------------------------------------------------
- ------------------------------------------------------
- ------------------------------------------------------
- for step = 1, steps do
- AddSimpleClause{
- Var.piece_type_bin[step][1], true,
- Var.piece_type_bin[step][2], true,
- Var.piece_type_bin[step][3], true
- }
- for b1 = 0, 1 do for b2 = 0, 1 do for b3 = 0, 1 do
- n = 4*b1 + 2*b2 + b3
- if b1 == 1 then bool1 = true else bool1=false end
- if b2 == 1 then bool2 = true else bool2=false end
- if b3 == 1 then bool3 = true else bool3=false end
- if n > 0 then
- AddIfAndOnlyIfClause(
- "ALL of", {
- Var.piece_type_bin[step][1], bool1,
- Var.piece_type_bin[step][2], bool2,
- Var.piece_type_bin[step][3], bool3
- }, "if and only if",
- "ALL of", {
- Var.piece_type[step][n], true
- })
- end
- end end end
- for r = 1, vrows-1 do for c = 1, vcols do
- AddIfAndOnlyIfClause(
- "ALL of", {
- Var.new_block_path[step][r][c], true,
- Var.new_block_path[step][r+1][c], true
- }, "if and only if",
- "ALL of", {
- Var.new_block_path_vcon[step][r][c], true
- })
- end end
- for r = vrow_offset + 1, rows + vrow_offset do
- local p = {}
- for c = 1, vcols do
- p[#p + 1] = Var.new_block_path[step][r][c]
- p[#p + 1] = true
- end
- local t = {}
- for c = 1, vcols do
- t[#t + 1] = Var.new_block_path_vcon[step][r-1][c]
- t[#t + 1] = true
- end
- AddIfThenClause("if ONE", p, "then ONE", t)
- end
- AddSimpleClause{Var.new_block_path[step][vrow_offset + 1][vcol_offset + 5], true}
- for r = 1, vrows do
- for left = 1, vcols - 2 do for middle = left + 1, vcols - 1 do for right = middle + 1, vcols do
- AddSimpleClause{
- Var.new_block_path[step][r][left], false,
- Var.new_block_path[step][r][middle], true,
- Var.new_block_path[step][r][right], false
- }
- end end end
- end
- for b1 = 0, 1 do for b2 = 0, 1 do for b3 = 0, 1 do for b4 = 0, 1 do for b5 = 0, 1 do
- if b1 == 1 then bool1 = true else bool1=false end
- if b2 == 1 then bool2 = true else bool2=false end
- if b3 == 1 then bool3 = true else bool3=false end
- if b4 == 1 then bool4 = true else bool4=false end
- if b5 == 1 then bool5 = true else bool5=false end
- c = 16*b1 + 8*b2 + 4*b3 + 2*b4 + b5
- if c <= vcol_offset or c > cols + vcol_offset then
- AddSimpleClause{
- Var.final_col_bin[step][1], not bool1,
- Var.final_col_bin[step][2], not bool2,
- Var.final_col_bin[step][3], not bool3,
- Var.final_col_bin[step][4], not bool4,
- Var.final_col_bin[step][5], not bool5}
- end
- if c > 0 and c <= vcols then
- AddIfAndOnlyIfClause(
- "ALL of", {
- Var.final_col_bin[step][1], bool1,
- Var.final_col_bin[step][2], bool2,
- Var.final_col_bin[step][3], bool3,
- Var.final_col_bin[step][4], bool4,
- Var.final_col_bin[step][5], bool5},
- "if and only if",
- "ALL of", {
- Var.final_col[step][c], true})
- end
- end end end end end
- for b1 = 0, 1 do for b2 = 0, 1 do for b3 = 0, 1 do for b4 = 0, 1 do for b5 = 0, 1 do
- if b1 == 1 then bool1 = true else bool1=false end
- if b2 == 1 then bool2 = true else bool2=false end
- if b3 == 1 then bool3 = true else bool3=false end
- if b4 == 1 then bool4 = true else bool4=false end
- if b5 == 1 then bool5 = true else bool5=false end
- r = 16*b1 + 8*b2 + 4*b3 + 2*b4 + b5
- if r >= rows + vrow_offset + 1 or r <= vrow_offset then
- AddSimpleClause{
- Var.final_row_bin[step][1], not bool1,
- Var.final_row_bin[step][2], not bool2,
- Var.final_row_bin[step][3], not bool3,
- Var.final_row_bin[step][4], not bool4,
- Var.final_row_bin[step][5], not bool5}
- end
- if r >= vrow_offset + 1 and r <= rows + vrow_offset then AddIfAndOnlyIfClause(
- "ALL of", {
- Var.final_row_bin[step][1], bool1,
- Var.final_row_bin[step][2], bool2,
- Var.final_row_bin[step][3], bool3,
- Var.final_row_bin[step][4], bool4,
- Var.final_row_bin[step][5], bool5},
- "if and only if",
- "ALL of", {
- Var.final_row[step][r], true})
- end
- end end end end end
- AddSimpleClause{
- Var.piece_type_bin[step][1], true,
- Var.piece_type_bin[step][2], true,
- Var.piece_type_bin[step][3], true
- }
- for b1 = 0, 1 do for b2 = 0, 1 do for b3 = 0, 1 do
- n = 4*b1 + 2*b2 + b3
- if b1 == 1 then bool1 = true else bool1=false end
- if b2 == 1 then bool2 = true else bool2=false end
- if b3 == 1 then bool3 = true else bool3=false end
- if n > 0 then
- AddIfAndOnlyIfClause(
- "ALL of", {
- Var.piece_type_bin[step][1], bool1,
- Var.piece_type_bin[step][2], bool2,
- Var.piece_type_bin[step][3], bool3
- }, "if and only if",
- "ALL of", {
- Var.piece_type[step][n], true
- })
- end
- end end end
- for r = 1, vrows - 2 do for c = 1, vcols - 1 do
- AddIfThenClause(
- "if ALL", {
- Var.final_row[step][r], true,
- Var.final_col[step][c], true,
- }, "then ALL", {
- Var.new_block_path[step][r][c], true
- })
- AddIfThenClause(
- "if ALL", {
- Var.final_row[step][r], true,
- Var.final_col[step][c], true,
- Var.piece_type[step][1], true
- }, "then ONE", {
- Var.playingfield[step][r+2][c], true,
- Var.playingfield[step][r+2][c+1], true
- })
- end end
- for r = 1, vrows-1 do for c = 1, vcols-1 do
- AddIfThenClause(
- "if ALL", {
- Var.new_block_path[step][r][c], true,
- Var.piece_type[step][1], true
- }, "then ALL", {
- Var.playingfield[step][r][c], false,
- Var.playingfield[step][r][c+1], false,
- Var.playingfield[step][r+1][c], false,
- Var.playingfield[step][r+1][c+1], false
- })
- end end
- for r_aim = 1, vrows do for c_aim = 1, vcols do
- local t = {Var.playingfield[step][r_aim][c_aim], true}
- for r = vrow_offset + 1, rows + vrow_offset do for c = vcol_offset + 1, cols + vcol_offset do
- if (r == r_aim and c == c_aim)
- or (r == r_aim and c+1 == c_aim)
- or (r+1 == r_aim and c == c_aim)
- or (r+1 == r_aim and c+1 == c_aim)
- then
- helper_count = helper_count + 1
- v = "h"..helper_count
- NewVar(v)
- AddIfAndOnlyIfClause(
- "ALL of", {
- Var[v], true},
- "if and only if",
- "ALL of", {
- Var.final_row[step][r], true,
- Var.final_col[step][c], true,
- Var.piece_type[step][1], true}
- )
- t[#t + 1] = Var[v]
- t[#t + 1] = true
- end
- end end
- AddIfAndOnlyIfClause(
- "ALL of",
- {Var.intermediate_playingfield[step][r_aim][c_aim], true},
- "if and only if",
- "ONE of",
- t
- )
- end end
- for r = 1, vrows do
- if r >= vrow_offset + 1 and r <= rows + vrow_offset then
- local t = {}
- for c = vcol_offset + 1, cols + vcol_offset do
- t[#t+1] = Var.intermediate_playingfield[step][r][c]
- t[#t+1] = true
- end
- AddIfAndOnlyIfClause(
- "ALL of", {
- Var.delete_row[step][r], true},
- "if and only if",
- "ALL of",
- t
- )
- else
- AddSimpleClause{Var.delete_row[step][r], false}
- end
- end
- for r = vrow_offset + 1, vrows do
- AddIfAndOnlyIfClause(
- "ALL of", {
- Var.connected_deleted_rows[step][r][1], true},
- "if and only if",
- "ALL of", {
- Var.delete_row[step][r], true,
- Var.delete_row[step][r-1], false}
- )
- AddIfAndOnlyIfClause(
- "ALL of", {
- Var.connected_deleted_rows[step][r][2], true},
- "if and only if",
- "ALL of", {
- Var.delete_row[step][r], true,
- Var.delete_row[step][r-1], true,
- Var.delete_row[step][r-2], false}
- )
- AddIfAndOnlyIfClause(
- "ALL of", {
- Var.connected_deleted_rows[step][r][3], true},
- "if and only if",
- "ALL of", {
- Var.delete_row[step][r], true,
- Var.delete_row[step][r-1], true,
- Var.delete_row[step][r-2], true,
- Var.delete_row[step][r-3], false}
- )
- AddIfAndOnlyIfClause(
- "ALL of", {
- Var.connected_deleted_rows[step][r][4], true},
- "if and only if",
- "ALL of", {
- Var.delete_row[step][r], true,
- Var.delete_row[step][r-1], true,
- Var.delete_row[step][r-2], true,
- Var.delete_row[step][r-3], true}
- )
- end
- -- that's REALLY complicated stuff here...
- for r = vrows, rows + vrow_offset + 1, -1 do
- for k = 1, 4 do
- AddSimpleClause{Var.move_row_down_by[step][r][k], false}
- end
- end
- for r = rows + vrow_offset, vrow_offset + 1, -1 do
- --1/0
- helper_count = helper_count + 1
- v = "h"..helper_count
- NewVar(v)
- AddIfAndOnlyIfClause(
- "ALL of", {
- Var[v], true},
- "if and only if",
- "ALL of",{
- Var.move_row_down_by[step][r + 1][1], true,
- Var.delete_row[step][r], false}
- )
- t = {Var[v], true}
- -- 0/1
- helper_count = helper_count + 1
- v = "h"..helper_count
- NewVar(v)
- AddIfAndOnlyIfClause(
- "ALL of", {
- Var[v], true},
- "if and only if",
- "ALL of",{
- Var.move_row_down_by[step][r + 1][1], false,
- Var.move_row_down_by[step][r + 1][2], false,
- Var.move_row_down_by[step][r + 1][3], false,
- Var.move_row_down_by[step][r + 1][4], false,
- Var.connected_deleted_rows[step][r][1], true}
- )
- t[#t + 1] = Var[v]
- t[#t + 1] = true
- -- 1
- AddIfAndOnlyIfClause(
- "ALL of", {
- Var.move_row_down_by[step][r][1], true},
- "if and only if",
- "ONE of",
- t
- )
- -- 2/0
- helper_count = helper_count + 1
- v = "h"..helper_count
- NewVar(v)
- AddIfAndOnlyIfClause(
- "ALL of", {
- Var[v], true},
- "if and only if",
- "ALL of",{
- Var.move_row_down_by[step][r + 1][2], true,
- Var.delete_row[step][r], false}
- )
- t = {Var[v], true}
- -- 1/1
- helper_count = helper_count + 1
- v = "h"..helper_count
- NewVar(v)
- AddIfAndOnlyIfClause(
- "ALL of", {
- Var[v], true},
- "if and only if",
- "ALL of",{
- Var.move_row_down_by[step][r + 1][1], true,
- Var.connected_deleted_rows[step][r][1], true}
- )
- t[#t + 1] = Var[v]
- t[#t + 1] = true
- -- 0/2
- helper_count = helper_count + 1
- v = "h"..helper_count
- NewVar(v)
- AddIfAndOnlyIfClause(
- "ALL of", {
- Var[v], true},
- "if and only if",
- "ALL of",{
- Var.move_row_down_by[step][r + 1][1], false,
- Var.move_row_down_by[step][r + 1][2], false,
- Var.move_row_down_by[step][r + 1][3], false,
- Var.move_row_down_by[step][r + 1][4], false,
- Var.connected_deleted_rows[step][r][2], true}
- )
- t[#t + 1] = Var[v]
- t[#t + 1] = true
- -- 2
- AddIfAndOnlyIfClause(
- "ALL of", {
- Var.move_row_down_by[step][r][2], true},
- "if and only if",
- "ONE of",
- t
- )
- -- 3/0
- helper_count = helper_count + 1
- v = "h"..helper_count
- NewVar(v)
- AddIfAndOnlyIfClause(
- "ALL of", {
- Var[v], true},
- "if and only if",
- "ALL of",{
- Var.move_row_down_by[step][r + 1][3], true,
- Var.delete_row[step][r], false}
- )
- t = {Var[v], true}
- -- 2/1
- helper_count = helper_count + 1
- v = "h"..helper_count
- NewVar(v)
- AddIfAndOnlyIfClause(
- "ALL of", {
- Var[v], true},
- "if and only if",
- "ALL of",{
- Var.move_row_down_by[step][r + 1][2], true,
- Var.connected_deleted_rows[step][r][1], true}
- )
- t[#t + 1] = Var[v]
- t[#t + 1] = true
- -- 1/2
- helper_count = helper_count + 1
- v = "h"..helper_count
- NewVar(v)
- AddIfAndOnlyIfClause(
- "ALL of", {
- Var[v], true},
- "if and only if",
- "ALL of",{
- Var.move_row_down_by[step][r + 1][1], true,
- Var.connected_deleted_rows[step][r][2], true}
- )
- t[#t + 1] = Var[v]
- t[#t + 1] = true
- -- 0/3
- helper_count = helper_count + 1
- v = "h"..helper_count
- NewVar(v)
- AddIfAndOnlyIfClause(
- "ALL of", {
- Var[v], true},
- "if and only if",
- "ALL of",{
- Var.move_row_down_by[step][r + 1][1], false,
- Var.move_row_down_by[step][r + 1][2], false,
- Var.move_row_down_by[step][r + 1][3], false,
- Var.move_row_down_by[step][r + 1][4], false,
- Var.connected_deleted_rows[step][r][3], true}
- )
- t[#t + 1] = Var[v]
- t[#t + 1] = true
- -- 3
- AddIfAndOnlyIfClause(
- "ALL of", {
- Var.move_row_down_by[step][r][3], true},
- "if and only if",
- "ONE of",
- t
- )
- -- 4/0
- helper_count = helper_count + 1
- v = "h"..helper_count
- NewVar(v)
- AddIfAndOnlyIfClause(
- "ALL of", {
- Var[v], true},
- "if and only if",
- "ALL of",{
- Var.move_row_down_by[step][r + 1][4], true,
- Var.delete_row[step][r], false}
- )
- t = {Var[v], true}
- -- 3/1
- helper_count = helper_count + 1
- v = "h"..helper_count
- NewVar(v)
- AddIfAndOnlyIfClause(
- "ALL of", {
- Var[v], true},
- "if and only if",
- "ALL of",{
- Var.move_row_down_by[step][r + 1][3], true,
- Var.connected_deleted_rows[step][r][1], true}
- )
- t[#t + 1] = Var[v]
- t[#t + 1] = true
- -- 2/2
- helper_count = helper_count + 1
- v = "h"..helper_count
- NewVar(v)
- AddIfAndOnlyIfClause(
- "ALL of", {
- Var[v], true},
- "if and only if",
- "ALL of",{
- Var.move_row_down_by[step][r + 1][2], true,
- Var.connected_deleted_rows[step][r][2], true}
- )
- t[#t + 1] = Var[v]
- t[#t + 1] = true
- -- 1/3
- helper_count = helper_count + 1
- v = "h"..helper_count
- NewVar(v)
- AddIfAndOnlyIfClause(
- "ALL of", {
- Var[v], true},
- "if and only if",
- "ALL of",{
- Var.move_row_down_by[step][r + 1][1], true,
- Var.connected_deleted_rows[step][r][3], true}
- )
- t[#t + 1] = Var[v]
- t[#t + 1] = true
- -- 0/4
- helper_count = helper_count + 1
- v = "h"..helper_count
- NewVar(v)
- AddIfAndOnlyIfClause(
- "ALL of", {
- Var[v], true},
- "if and only if",
- "ALL of",{
- Var.move_row_down_by[step][r + 1][1], false,
- Var.move_row_down_by[step][r + 1][2], false,
- Var.move_row_down_by[step][r + 1][3], false,
- Var.move_row_down_by[step][r + 1][4], false,
- Var.connected_deleted_rows[step][r][4], true}
- )
- t[#t + 1] = Var[v]
- t[#t + 1] = true
- -- 4
- AddIfAndOnlyIfClause(
- "ALL of", {
- Var.move_row_down_by[step][r][4], true},
- "if and only if",
- "ONE of",
- t
- )
- end
- for r = 1, vrows do
- AddIfAndOnlyIfClause(
- "ALL of",{
- Var.dont_move_row[step][r], true},
- "if and only if",
- "ALL of",{
- Var.move_row_down_by[step][r][1], false,
- Var.move_row_down_by[step][r][2], false,
- Var.move_row_down_by[step][r][3], false,
- Var.move_row_down_by[step][r][4], false}
- )
- end
- for r = 1, vrow_offset do for c = 1, vcols do
- AddIfAndOnlyIfClause(
- "ALL of",{
- Var.playingfield[step + 1][r][c], true},
- "if and only if",
- "ALL of",{
- Var.playingfield[step][r][c], true}
- )
- end end
- for r = rows + vrow_offset + 1, vrows do for c = 1, vcols do
- AddIfAndOnlyIfClause(
- "ALL of",{
- Var.playingfield[step + 1][r][c], true},
- "if and only if",
- "ALL of",{
- Var.playingfield[step][r][c], true}
- )
- end end
- for r = vrow_offset + 1, rows + vrow_offset do for c = 1, vcols do
- AddIfThenClause(
- "if ALL", {
- Var.intermediate_playingfield[step][r][c], true,
- Var.dont_move_row[step][r], true},
- "then ALL", {
- Var.playingfield[step + 1][r][c], true}
- )
- AddIfThenClause(
- "if ALL", {
- Var.intermediate_playingfield[step][r][c], false,
- Var.dont_move_row[step][r], true},
- "then ALL", {
- Var.playingfield[step + 1][r][c], false}
- )
- for downmovement = 1, 4 do
- AddIfThenClause(
- "if ALL", {
- Var.intermediate_playingfield[step][r - downmovement][c], true,
- Var.move_row_down_by[step][r][downmovement], true},
- "then ALL", {
- Var.playingfield[step + 1][r][c], true}
- )
- AddIfThenClause(
- "if ALL", {
- Var.intermediate_playingfield[step][r - downmovement][c], false,
- Var.move_row_down_by[step][r][downmovement], true},
- "then ALL", {
- Var.playingfield[step + 1][r][c], false}
- )
- end
- end end
- --for testing: enforce a specific piece type
- AddSimpleClause{Var.piece_type[step][1], true}
- ------------------------------------------------------
- ------------------------------------------------------
- ------------------------------------------------------
- ---- ----
- ---- ----
- ---- ----
- ---- LARGE LOOP ----
- ---- END ----
- ---- ----
- ---- ----
- ------------------------------------------------------
- ------------------------------------------------------
- ------------------------------------------------------
- end
- ---------------------------------------------------------------------
- ---------------------------------------------------------------------
- -- for testing...
- ---------------------------------------------------------------------
- ---------------------------------------------------------------------
- -- enforce a specific type of block
- -- force a specific destination field
- destination_field = {
- --row 1 to 5
- {0,0,0,0,0,0,0,0,0,0},
- {0,0,0,0,0,0,0,0,0,0},
- {0,0,0,0,0,0,0,0,0,0},
- {0,0,0,0,0,0,0,0,0,0},
- {0,0,0,0,0,0,0,0,0,0},
- --row 6 to 10
- {0,0,0,0,0,0,0,0,0,0},
- {0,0,0,0,0,0,0,0,0,0},
- {0,0,0,0,0,0,0,0,0,0},
- {0,0,0,0,0,0,0,0,0,0},
- {0,0,0,0,0,0,0,0,0,0},
- --row 11 to 15
- {0,0,0,0,0,0,0,0,0,0},
- {0,0,0,0,0,0,0,0,0,0},
- {0,0,0,0,0,0,0,0,0,0},
- {0,0,0,0,0,0,0,0,0,0},
- {0,0,0,0,0,0,0,0,0,0},
- --row 16 to 20
- {0,0,0,0,0,0,0,0,0,0},
- {0,0,0,0,0,0,0,0,0,0},
- {0,0,0,0,0,0,0,0,0,0},
- {0,0,0,0,0,0,0,0,0,0},
- {0,0,0,0,0,0,0,0,0,0}
- }
- for r = 1, rows do for c = 1, cols do
- local b
- if destination_field[r][c] == 1 then b = true else b = false end
- AddSimpleClause{Var.playingfield[steps+1][r + vrow_offset][c + vcol_offset], b}
- end end
- --]]
- WriteSATfile()
- os.execute("minisat satfile.cnf solutionfile")
- ParseSolution()
- --PrintSolution()
- if Sol.playingfield == nil then
- print("no solution found!")
- return
- end
- for step = 1, steps do
- for r = 1, vrows do
- local s = ""
- for c = 1, vcols do
- if Sol.intermediate_playingfield[step][r][c] then
- if Sol.playingfield[step][r][c] then
- s = s .. "[]"
- elseif Sol.final_row[step][r] and Sol.final_col[step][c] then
- s = s .. "*!"
- else
- s = s .. "@?"
- end
- elseif Sol.new_block_path[step][r][c] then
- s = s .. "* "
- else
- s = s .. " "
- end
- end
- s = s.." "
- for c = 1, vcols do
- if Sol.playingfield[step+1][r][c] then
- s = s .. "[]"
- else
- s = s .. " "
- end
- end
- print(s)
- end
- for r = 1, vrows do if Sol.final_row[step][r] then print("final row: "..r) end end
- for c = 1, vcols do if Sol.final_col[step][c] then print("final col: "..c) end end
- print()
- print()
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement