算法的大概思路如下:决策树的思路,每层结点都将在1至8中取出一个数删掉,下一层的结点就是剩下的数。每层要取出的数已经用数组delid列出,正常情况下,上一层取出的数下面的每一层都将不再出现,但我的程序的结果总是有重复的数在下面的层数中出现,请各位大哥帮忙看看,不胜感激。(注:由于我把三维的函数简化成了2维,其中参数y,j是多余的,可以不用管)
procedure TForm1.Button6Click(Sender: TObject);
var i:integer;
x:integer;
y:integer;
w:string;
const delid:array[1..6] of integer =(5,6,2,3,4,7);function Deid (x,y,i: integer): integer;
var j:integer;
h:integer;
f:integer;
g:integer;
temp:integer;
p:integer;
min:integer;
begin
temp:=9;
min:=0;
for f:=1 to x do
begin
g:=1;
while g<=x do
begin
p:=delid[g];
if p<temp then
begin
if p>min then
begin
h:=p;
p:=temp;
temp:=h;
end;
end;
g:=g+1;
end;
if i>=temp then
begin
i:=i+1;
end;
min:=temp;
temp:=p;
end;
result:=i;
end;begin
with adoquery1 do
begin
close;
sql.clear;
sql.add('create table b (x1 integer,y1 integer,i1 integer,str string)');
execsql;
end;for x:=1 to 6 do
begin
for y:=1 to trunc(power(2,x)) do
begin
for i:=1 to 8-x do
begin
w:=deid(x,y,i);
with adoquery1 do
begin
close;
sql.clear;
sql.add('insert into b (x1,y1,i1,str) values(x,y,i,w)');
parameters.parambyname('x').value:=x;
parameters.parambyname('y').value:=y;
parameters.parambyname('i').value:=i;
parameters.parambyname('w').value:=w;
execsql;
end;end;
end;
end;
end;
procedure TForm1.Button6Click(Sender: TObject);
var i:integer;
x:integer;
y:integer;
w:string;
const delid:array[1..6] of integer =(5,6,2,3,4,7);function Deid (x,y,i: integer): integer;
var j:integer;
h:integer;
f:integer;
g:integer;
temp:integer;
p:integer;
min:integer;
begin
temp:=9;
min:=0;
for f:=1 to x do
begin
g:=1;
while g<=x do
begin
p:=delid[g];
if p<temp then
begin
if p>min then
begin
h:=p;
p:=temp;
temp:=h;
end;
end;
g:=g+1;
end;
if i>=temp then
begin
i:=i+1;
end;
min:=temp;
temp:=p;
end;
result:=i;
end;begin
with adoquery1 do
begin
close;
sql.clear;
sql.add('create table b (x1 integer,y1 integer,i1 integer,str string)');
execsql;
end;for x:=1 to 6 do
begin
for y:=1 to trunc(power(2,x)) do
begin
for i:=1 to 8-x do
begin
w:=deid(x,y,i);
with adoquery1 do
begin
close;
sql.clear;
sql.add('insert into b (x1,y1,i1,str) values(x,y,i,w)');
parameters.parambyname('x').value:=x;
parameters.parambyname('y').value:=y;
parameters.parambyname('i').value:=i;
parameters.parambyname('w').value:=w;
execsql;
end;end;
end;
end;
end;
上面这句话好像有点歧义,我的意思就是下面的层中出现了上面的层中已取出的数。
另外,我说的层数就是用参数x来定义。x=1为第一层,x=2为第二层,一共6层。
给你写个新的代码。 var
i,j:integer;
strs:TStringList;
const delid:array[1..6] of integer =(5,6,2,3,4,7);
begin
strs:=TStringList.Create;
for i:=1 to 8 do
strs.Add(IntToStr(i));///////加如初始值1----------8
............... for i:=1 to 6 do
begin
strs.Delete(strs.IndexOf(IntToStr(delid[i])));
for j:=0 to strs.Count-1 do
with adoquery1 do
begin
close;
sql.clear;
sql.add('insert into b (x1,i1,str) values(x,i,w)');
parameters.parambyname('x').value:=i;
parameters.parambyname('i').value:=j+1;
parameters.parambyname('w').value:=strs.Strings[j];
execsql;
end;
end;
strs.Free;
end;