Mit deinen beiden Bedingungen hast du natürlich recht.
Ich habe irgendwo was zu einem Ansatz gelesen, dass Sudokus erstellt werden, indem bei einem gefüllten Sudoku nach und nach Felder gestrichen werden.
Falls meine Idee nicht stimmt, würde es mich interessieren, wie man es mit vertretbarem Aufwand anders lösen könnte.
Hier ist mal mein Code, wie ich das bisher generiere. Ist nicht besonders schön, aber man sollte verstehen, was ich da mache.
Spoiler
function sudoku(mode,level)
local mode = mode or 1
local level = level or 3
%Variablen indizieren%//
local matrix1={}
local matrix2={}
local matrix3={}
local matrix4={}
local matrix5={}
local loesung={}
%Sudoku generieren%//
%Variablen indizieren%//
local order1={1,2,3}
local order2={4,5,6}
local order3={7,8,9}
%\\
%Zeilen mischen%//
matrix1={%//
1,2,3,4,5,6,7,8,9,
4,5,6,7,8,9,1,2,3,
7,8,9,1,2,3,4,5,6,
9,1,2,3,4,5,6,7,8,
6,7,8,9,1,2,3,4,5,
3,4,5,6,7,8,9,1,2,
8,9,1,2,3,4,5,6,7,
5,6,7,8,9,1,2,3,4,
2,3,4,5,6,7,8,9,1
}%\\
order1=table.shuffle(order1)
order2=table.shuffle(order2)
order3=table.shuffle(order3)
local zeile1= {}
local zeile2= {}
local zeile3= {}
local zeile4= {}
local zeile5= {}
local zeile6= {}
local zeile7= {}
local zeile8= {}
local zeile9= {}
local matrix_zeilen={}
local matrix_spalten={}
for i = 1,9,1 do
table.insert(zeile1,matrix1[i])
table.insert(zeile2,matrix1[i+9])
table.insert(zeile3,matrix1[i+18])
table.insert(zeile4,matrix1[i+27])
table.insert(zeile5,matrix1[i+36])
table.insert(zeile6,matrix1[i+45])
table.insert(zeile7,matrix1[i+54])
table.insert(zeile8,matrix1[i+63])
table.insert(zeile9,matrix1[i+72])
end
matrix_zeilen = {zeile1,zeile2,zeile3,zeile4,zeile5,zeile6,zeile7,zeile8,zeile9}
matrix_zeilen[1],matrix_zeilen[2],matrix_zeilen[3]=matrix_zeilen[order1[1]],matrix_zeilen[order1[2]],matrix_zeilen[order1[3]]
matrix_zeilen[4],matrix_zeilen[5],matrix_zeilen[6]=matrix_zeilen[order2[1]],matrix_zeilen[order2[2]],matrix_zeilen[order2[3]]
matrix_zeilen[7],matrix_zeilen[8],matrix_zeilen[9]=matrix_zeilen[order3[1]],matrix_zeilen[order3[2]],matrix_zeilen[order3[3]]
zeile1=matrix_zeilen[1]
zeile2=matrix_zeilen[2]
zeile3=matrix_zeilen[3]
zeile4=matrix_zeilen[4]
zeile5=matrix_zeilen[5]
zeile6=matrix_zeilen[6]
zeile7=matrix_zeilen[7]
zeile8=matrix_zeilen[8]
zeile9=matrix_zeilen[9]
%\\
%Spalten mischen%//
for i = 1,9,1 do
table.insert(matrix2,zeile1[i])
end
for i = 1,9,1 do
table.insert(matrix2,zeile2[i])
end
for i = 1,9,1 do
table.insert(matrix2,zeile3[i])
end
for i = 1,9,1 do
table.insert(matrix2,zeile4[i])
end
for i = 1,9,1 do
table.insert(matrix2,zeile5[i])
end
for i = 1,9,1 do
table.insert(matrix2,zeile6[i])
end
for i = 1,9,1 do
table.insert(matrix2,zeile7[i])
end
for i = 1,9,1 do
table.insert(matrix2,zeile8[i])
end
for i = 1,9,1 do
table.insert(matrix2,zeile9[i])
end
order1=table.shuffle(order1)
order2=table.shuffle(order2)
order3=table.shuffle(order3)
spalte1={}
spalte2={}
spalte3={}
spalte4={}
spalte5={}
spalte6={}
spalte7={}
spalte8={}
spalte9={}
for i = 1,73,9 do
table.insert(spalte1,matrix2[i])
table.insert(spalte2,matrix2[i+1])
table.insert(spalte3,matrix2[i+2])
table.insert(spalte4,matrix2[i+3])
table.insert(spalte5,matrix2[i+4])
table.insert(spalte6,matrix2[i+5])
table.insert(spalte7,matrix2[i+6])
table.insert(spalte8,matrix2[i+7])
table.insert(spalte9,matrix2[i+8])
end
matrix_spalten = {spalte1,spalte2,spalte3,spalte4,spalte5,spalte6,spalte7,spalte8,spalte9}
matrix_spalten[1],matrix_spalten[2],matrix_spalten[3]=matrix_spalten[order1[1]],matrix_spalten[order1[2]],matrix_spalten[order1[3]]
matrix_spalten[4],matrix_spalten[5],matrix_spalten[6]=matrix_spalten[order2[1]],matrix_spalten[order2[2]],matrix_spalten[order2[3]]
matrix_spalten[7],matrix_spalten[8],matrix_spalten[9]=matrix_spalten[order3[1]],matrix_spalten[order3[2]],matrix_spalten[order3[3]]
spalte1= matrix_spalten[1]
spalte2= matrix_spalten[2]
spalte3= matrix_spalten[3]
spalte4= matrix_spalten[4]
spalte5= matrix_spalten[5]
spalte6= matrix_spalten[6]
spalte7= matrix_spalten[7]
spalte8= matrix_spalten[8]
spalte9= matrix_spalten[9]
%\\
%Quadrate mischen (horizontal)%//
for i = 1,9,1 do
table.insert(matrix3,spalte1[i])
table.insert(matrix3,spalte2[i])
table.insert(matrix3,spalte3[i])
table.insert(matrix3,spalte4[i])
table.insert(matrix3,spalte5[i])
table.insert(matrix3,spalte6[i])
table.insert(matrix3,spalte7[i])
table.insert(matrix3,spalte8[i])
table.insert(matrix3,spalte9[i])
end
order1=table.shuffle(order1)
local quadrath1={}
local quadrath2={}
local quadrath3={}
for i = 1,82,9 do
table.insert(quadrath1,matrix3[i])
table.insert(quadrath1,matrix3[i+1])
table.insert(quadrath1,matrix3[i+2])
table.insert(quadrath2,matrix3[i+3])
table.insert(quadrath2,matrix3[i+4])
table.insert(quadrath2,matrix3[i+5])
table.insert(quadrath3,matrix3[i+6])
table.insert(quadrath3,matrix3[i+7])
table.insert(quadrath3,matrix3[i+8])
end
matrix_quadrateh = {quadrath1,quadrath2,quadrath3}
%
matrix_quadrateh[1],matrix_quadrateh[2],matrix_quadrateh[3]=matrix_quadrateh[order1[1]],matrix_quadrateh[order1[2]],matrix_quadrateh[order1[3]]
%
quadrath1= matrix_quadrateh[1]
quadrath2= matrix_quadrateh[2]
quadrath3= matrix_quadrateh[3]
%\\
%Quadrate mischen (vertikal)%//
for i = 1,26,3 do
table.insert(matrix4,quadrath1[i])
table.insert(matrix4,quadrath1[i+1])
table.insert(matrix4,quadrath1[i+2])
table.insert(matrix4,quadrath2[i])
table.insert(matrix4,quadrath2[i+1])
table.insert(matrix4,quadrath2[i+2])
table.insert(matrix4,quadrath3[i])
table.insert(matrix4,quadrath3[i+1])
table.insert(matrix4,quadrath3[i+2])
end
order1=table.shuffle(order1)
local quadratv1={}
local quadratv2={}
local quadratv3={}
for i = 1,27,1 do
table.insert(quadratv1,matrix4[i])
table.insert(quadratv2,matrix4[i+27])
table.insert(quadratv3,matrix4[i+54])
end
local matrix_quadratev = {quadratv1,quadratv2,quadratv3}
matrix_quadratev[1],matrix_quadratev[2],matrix_quadratev[3]=matrix_quadratev[order1[1]],matrix_quadratev[order1[2]],matrix_quadratev[order1[3]]
quadratv1= matrix_quadratev[1]
quadratv2= matrix_quadratev[2]
quadratv3= matrix_quadratev[3]
for i = 1,27,1 do
table.insert(matrix5,quadratv1[i])
end
for i = 1,27,1 do
table.insert(matrix5,quadratv2[i])
end
for i = 1,27,1 do
table.insert(matrix5,quadratv3[i])
end
%\\
%\\
%Leere Quadrate generieren%//
if level == 1 then
%Sehr einfach 5
local sehreinfach={%//
{%//
0,1,1,1,1,1,1,0,1,
1,0,1,1,1,0,1,1,1,
0,1,1,1,0,1,1,1,0,
1,1,0,1,1,1,1,0,1,
1,0,1,1,1,0,1,1,1,
1,1,1,1,1,1,0,1,1,
1,1,1,0,1,1,1,1,1,
0,1,1,1,1,1,1,0,1,
1,1,1,1,0,1,1,1,1
},%\\
{%//
1,0,1,1,1,1,0,1,0,
1,1,1,1,0,1,1,0,1,
1,1,1,1,1,0,1,1,1,
1,1,0,1,1,1,1,1,1,
0,1,1,1,1,1,0,1,1,
1,1,1,1,0,1,1,0,1,
1,1,1,0,1,1,1,1,1,
1,0,1,1,1,0,1,1,0,
1,1,1,1,1,1,0,1,1
},%\\
{%//
1,1,1,1,0,1,1,1,1,
1,0,1,1,1,1,1,1,0,
1,1,1,1,1,0,1,1,1,
1,1,1,0,1,1,1,0,1,
1,0,1,1,1,1,0,1,1,
0,1,1,1,0,1,1,1,0,
1,1,1,0,1,1,1,0,1,
1,0,1,1,1,1,1,1,0
},%\\
{%//
1,1,0,1,1,1,1,1,1,
0,1,1,0,1,1,1,0,1,
1,1,1,1,1,0,1,1,1,
1,0,1,1,0,1,1,1,1,
1,1,0,1,1,1,1,1,0,
1,1,1,1,1,1,0,1,1,
1,1,1,0,1,1,1,1,1,
1,0,1,1,0,1,1,1,1,
0,1,0,1,1,1,1,0,1
},%\\
}%\\
loesung=sehreinfach[math.random(4)]
end
if level == 2 then
% Einfach 7/8
local einfach={%//
{%//
1,0,0,1,0,1,0,1,1,
1,0,1,0,1,1,1,0,1,
0,1,1,1,1,0,1,1,0,
0,1,1,0,1,1,1,0,1,
1,1,0,1,1,0,0,1,1,
1,0,1,0,0,1,1,1,0,
0,1,1,0,1,1,1,1,0,
0,1,1,1,1,0,1,0,1,
1,1,0,1,0,1,0,0,1
},%\\
{%//
1,0,0,1,0,0,0,1,1,
1,1,1,0,1,1,1,0,0,
0,1,1,1,0,1,1,1,0,
1,1,0,0,1,0,1,0,1,
0,1,1,0,1,1,1,1,0,
1,0,1,1,0,1,0,1,1,
0,1,1,1,0,1,1,1,0,
0,0,1,1,1,0,1,0,1,
1,1,0,0,1,1,0,1,1
},%\\
{%//
1,0,0,1,0,1,0,1,1,
1,0,1,0,1,1,1,1,0,
0,1,1,1,1,0,1,1,0,
0,1,1,1,0,0,1,0,1,
1,1,0,0,1,1,0,1,1,
1,0,1,1,1,0,1,1,0,
0,1,1,0,1,1,1,1,0,
1,0,1,1,1,0,1,0,1,
1,1,0,1,0,1,0,0,1
},%\\
{%//
1,1,0,1,1,0,0,1,1,
1,0,1,0,1,1,1,0,0,
0,1,1,1,0,1,1,1,0,
1,1,0,1,0,1,1,0,1,
0,1,1,1,1,0,1,1,0,
1,0,1,0,1,0,0,1,1,
0,1,1,1,0,1,1,1,0,
0,0,1,1,1,0,1,1,1,
1,1,0,0,1,1,0,0,1
},%\\
{%//
1,1,0,1,1,0,0,1,1,
1,0,1,1,1,0,1,0,1,
1,1,0,0,1,1,1,0,1,
0,1,1,1,0,1,1,1,0,
1,1,0,0,1,1,0,1,1,
0,1,1,1,0,1,1,1,0,
1,1,0,1,1,0,1,1,0,
1,0,1,1,0,1,1,0,1,
1,1,1,0,1,1,0,1,1
},%\\
{%//
1,1,1,0,1,0,1,1,1,
1,0,1,1,1,1,1,0,1,
1,1,0,1,0,1,0,1,0,
0,1,1,1,0,1,0,1,1,
1,0,1,0,1,0,1,1,1,
1,1,0,1,1,1,1,0,0,
0,1,1,1,0,1,1,1,0,
1,0,1,1,1,1,0,0,1,
1,1,0,0,1,0,1,1,1
},%\\
{%//
1,1,0,1,1,0,1,1,1,
1,0,1,1,0,1,1,0,1,
0,1,1,0,1,1,0,1,1,
0,1,1,1,0,1,1,1,0,
1,1,0,1,1,0,0,1,1,
0,1,1,1,0,1,1,1,0,
1,0,1,1,1,0,0,1,1,
1,0,1,0,1,1,1,0,1,
1,1,0,0,1,1,0,1,1
},%\\
{%//
1,1,1,0,1,0,0,1,1,
1,0,0,1,1,1,1,0,1,
0,1,1,1,0,1,1,1,0,
0,0,1,1,1,1,0,1,1,
1,1,1,0,1,0,1,0,1,
1,1,0,1,0,1,1,1,0,
0,1,0,1,0,1,0,1,1,
1,0,1,1,1,1,1,0,1,
1,1,1,0,1,0,1,1,1
},%\\
}%\\
loesung=einfach[math.random(8)]
end
if level == 3 then
% Mittel 9/10
local mittel={%//
{%//
0,1,1,1,0,1,1,0,0,
1,0,1,1,0,1,1,1,0,
1,0,0,0,1,1,1,0,1,
1,0,1,1,1,0,1,0,0,
1,0,1,0,1,1,0,1,1,
1,0,1,1,1,0,1,1,1,
1,0,1,1,1,0,1,0,1,
0,1,1,1,0,1,1,1,0,
0,1,1,1,0,1,1,1,0
},%\\
{%//
0,0,1,1,1,1,1,1,0,
1,1,0,0,0,0,0,0,1,
1,1,1,1,1,1,0,1,1,
1,1,1,1,0,1,0,1,1,
0,0,1,1,1,1,1,0,0,
1,1,0,0,1,0,1,1,1,
1,1,1,1,0,1,1,1,1,
1,1,0,1,1,0,0,1,0,
0,0,1,1,1,0,1,0,0
},%\\
{%//
0,1,1,1,0,1,1,1,0,
0,1,1,1,0,1,1,1,0,
1,0,1,0,1,1,1,0,1,
1,1,1,0,1,1,1,0,1,
1,1,0,1,1,0,1,0,1,
0,0,1,0,1,1,1,0,1,
1,0,1,1,1,0,0,0,1,
0,1,1,1,0,1,1,0,1,
0,0,1,1,0,1,1,1,0
},%\\
{%//
0,0,1,0,1,1,1,0,0,
0,1,0,0,1,1,0,1,1,
1,1,1,1,0,1,1,1,1,
1,1,1,0,1,0,0,1,1,
0,0,1,1,1,1,1,0,0,
1,1,0,1,0,1,1,1,1,
1,1,0,1,1,1,1,1,1,
1,0,0,0,0,0,0,1,1,
0,1,1,1,1,1,1,0,0
},%\\
{%//
1,0,1,0,1,1,1,0,1,
1,1,0,1,0,1,0,0,1,
0,1,1,0,1,1,1,1,0,
1,0,1,0,0,1,1,1,0,
1,1,0,1,1,0,0,1,1,
0,1,1,1,0,0,1,0,0,
0,1,1,1,1,0,0,1,1,
1,0,1,1,0,1,1,1,0,
1,0,1,1,1,1,1,0,1
},%\\
{%//
1,1,0,0,1,1,0,1,1,
0,0,1,1,1,0,1,1,0,
1,1,1,1,0,1,1,0,1,
1,1,1,1,1,0,0,1,0,
1,0,1,0,1,0,1,0,1,
1,1,0,0,0,1,1,1,1,
1,1,0,1,0,1,1,0,1,
0,1,1,0,1,1,1,0,0,
1,0,1,0,1,0,0,1,1
},%\\
{%//
1,0,1,1,1,1,1,0,1,
0,1,1,1,0,1,1,0,1,
1,1,0,0,1,1,1,1,0,
0,0,1,0,0,1,1,1,0,
1,1,0,0,1,1,0,1,1,
0,1,1,1,0,0,1,0,1,
0,1,1,1,1,0,1,1,0,
1,0,0,1,0,1,0,1,1,
1,0,1,1,1,0,1,0,1
},%\\
{%//
1,1,0,0,1,0,1,0,1,
0,0,1,1,1,0,1,1,0,
1,0,1,1,0,1,0,1,1,
1,1,1,1,0,0,0,1,1,
1,0,1,0,1,0,1,0,1,
0,1,0,0,1,1,1,1,1,
1,0,1,1,0,1,1,1,1,
0,1,1,0,1,1,1,0,0,
1,1,0,1,1,0,0,1,1
},%\\
}%\\
loesung=mittel[math.random(8)]
end
if level == 4 then
% schwer 9/10
local schwer={%//
{%//
1,0,0,0,1,0,1,1,0,
1,0,1,1,0,0,0,0,1,
1,0,0,0,0,1,0,0,1,
0,0,1,0,1,0,1,0,0,
1,0,1,1,0,0,1,1,1,
0,1,0,0,0,1,0,0,0,
1,1,0,1,0,0,0,1,1,
0,0,0,0,1,0,0,1,0,
0,0,0,1,0,0,0,1,0
},%\\
{%//
0,0,1,0,1,0,1,1,1,
0,0,1,1,0,0,0,0,0,
0,0,0,0,1,1,0,1,0,
1,0,1,0,1,0,0,1,0,
0,1,0,0,0,1,0,0,1,
0,0,0,1,0,0,1,0,0,
0,0,0,0,1,1,0,0,1,
1,1,1,0,1,0,0,0,1,
0,0,1,0,1,0,1,1,0
},%\\
{%//
0,1,0,0,0,1,0,0,0,
0,1,0,0,1,0,0,0,0,
1,1,0,0,0,1,0,1,1,
0,0,0,1,0,0,0,1,0,
1,1,1,0,0,1,1,0,1,
0,0,1,0,1,0,1,0,0,
1,0,0,1,0,0,0,0,1,
1,0,0,0,0,1,1,0,1,
0,1,1,0,1,0,0,0,1
},%\\
{%//
0,1,1,0,1,0,1,0,0,
1,0,0,0,1,0,1,1,1,
1,0,0,1,1,0,0,0,0,
0,0,1,0,0,1,0,0,0,
1,0,0,1,0,0,0,1,0,
0,1,0,0,1,0,1,0,1,
0,1,0,1,1,0,0,0,0,
0,0,0,0,0,1,1,0,0,
1,1,1,0,1,0,1,0,0
},%\\
{%//
1,0,1,1,1,0,0,0,0,
0,0,1,0,1,0,0,1,0,
0,0,0,0,0,0,1,0,1,
0,0,1,1,0,0,0,0,1,
1,0,0,0,0,0,1,0,1,
1,1,0,1,0,1,0,0,0,
1,0,0,1,0,0,0,1,1,
1,0,0,0,0,0,1,0,0,
0,1,1,1,0,0,0,1,0
},%\\
{%//
0,1,1,1,1,0,0,0,1,
1,0,0,1,0,0,0,0,0,
1,0,0,0,0,1,0,1,1,
1,0,1,1,0,1,0,0,1,
0,0,0,0,0,0,0,1,1,
0,0,0,1,0,0,0,0,0,
0,1,0,0,1,0,1,0,0,
1,0,1,0,0,0,0,1,0,
0,0,1,0,1,1,1,0,0
},%\\
{%//
0,1,0,0,0,1,1,1,0,
0,0,1,0,0,0,0,0,1,
1,1,0,0,0,1,0,0,1,
0,0,0,1,0,1,0,1,1,
1,0,1,0,0,0,0,0,1,
1,0,0,0,0,1,1,0,0,
1,0,1,0,0,0,0,0,0,
0,1,0,0,1,0,1,0,0,
0,0,0,0,1,1,1,0,1
},%\\
{%//
0,0,1,1,1,0,1,0,0,
0,1,0,0,0,0,1,0,1,
0,0,1,0,1,0,0,1,0,
0,0,0,0,0,1,0,0,0,
1,1,0,0,0,0,0,0,0,
1,0,0,1,0,1,1,0,1,
1,1,0,1,0,0,0,0,1,
0,0,0,0,0,1,0,0,1,
1,0,0,0,1,1,1,1,0
},%\\
}%\\
loesung=schwer[math.random(8)]
end
if level == 5 then
%Sehr einfach 5
local sehrschwer={%//
{%//
0,0,0,1,1,0,1,0,0,
1,0,0,0,0,1,0,0,0,
0,0,1,0,1,1,0,0,1,
0,0,1,0,0,0,1,0,1,
0,0,1,1,1,0,1,0,1,
1,0,1,1,0,0,0,0,0,
1,0,1,1,0,0,1,0,0,
1,1,0,0,0,1,0,0,0,
0,0,1,0,0,0,1,1,0
},%\\
{%//
0,1,1,1,0,0,0,1,0,
0,1,0,0,0,0,0,0,0,
1,0,1,1,1,1,1,0,0,
0,0,1,1,1,0,0,0,1,
0,0,0,0,1,0,1,0,1,
0,1,0,0,0,0,1,1,0,
1,0,1,0,1,1,0,0,1,
1,0,0,0,0,0,0,0,0,
0,0,0,0,1,1,1,0,0
},%\\
{%//
0,1,1,0,0,0,1,0,0,
0,0,0,1,0,0,0,1,1,
0,0,1,0,0,1,1,0,1,
0,0,0,0,0,1,1,0,1,
1,0,1,0,1,1,1,0,0,
1,0,1,0,0,0,1,0,0,
1,0,0,1,1,0,1,0,0,
0,0,0,1,0,0,0,0,1,
0,0,1,0,1,1,0,0,0
},%\\
{%//
0,0,1,1,1,0,0,0,0,
0,0,0,0,0,0,0,0,1,
1,0,0,1,1,0,1,0,1,
0,1,1,0,0,0,0,1,0,
1,0,1,0,1,0,0,0,0,
0,0,1,1,1,1,1,0,1,
0,0,0,0,0,0,0,1,0,
0,1,0,0,0,1,1,1,0
},%\\
}%\\
loesung=sehrschwer[math.random(4)]
end
%\\
local rv = {matrix5,loesung}
return rv
end