算法的大概思路如下:决策树的思路,每层结点都将在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;

解决方案 »

  1.   

    “有重复的数在下面的层数中出现”
    上面这句话好像有点歧义,我的意思就是下面的层中出现了上面的层中已取出的数。
    另外,我说的层数就是用参数x来定义。x=1为第一层,x=2为第二层,一共6层。
      

  2.   

    看不明白你的代码,没对齐,晕了。 
    给你写个新的代码。 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;