您的位置:程序门 -> delphi -> 语言基础/算法/系统设计



求一个矩阵搜索算法


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


求一个矩阵搜索算法[无满意答案结贴,结贴人:ch_2046]
发表于:2007-08-29 09:10:37 楼主
已知一个矩阵a(m*m维,且至少有一行为全零元素)     其中元素皆为0或1

现取出a的一行,比如第i行
若a[i,j]:=1,则记录j(j可能不唯一);
再取出第j行,若a[j,k]:=1,则记录k(j也可能不唯一);
取出地k行,若a[k,l]:=1,则记录l……依此类推,直到某一行不存在a[*,*]:=1为止(注意a还有个要求:若a[i,j]:=1,则a[j,i] <> 1,且a中至少有一行为全零元素,那么这个搜索必能达到中止条件)。
依此来生成矩阵b(m*m维),使得b第i行的第j、k、l……列均为1。

请问这个程序用delphi怎么实现?
发表于:2007-08-29 11:01:331楼 得分:0
是否应该还有一些条件,比如a[i,i]=0,不然如果a[1,1]是1,就一直会循环取第一行了吧.按你描述的情况来说.
发表于:2007-08-29 14:20:502楼 得分:0
楼上说的正是,对角元素a[i,i] <> 1
发表于:2007-08-29 19:00:483楼 得分:0
感觉像树的遍历搜索似的
可又不会写,麻烦各位
发表于:2007-08-30 11:00:434楼 得分:0
自己搞定了,等下把代码贴上来
发表于:2007-08-30 11:30:085楼 得分:0
等分,等看.:)
发表于:2007-08-31 15:44:396楼 得分:0
哦   学习一下先
发表于:2007-09-02 20:54:467楼 得分:0
type
    myintarray   =   array   of   integer;
    mytwodarray   =   array   of   array   of   integer;

var
    z,   y,   x,   v:   mytwodarray;

//*****************************************************

//获取数组中值为1的元素在数组中的下标
function   findindex(a:   myintarray):   myintarray;
var
    i,   j,   k:   integer;
    arraytemp:   myintarray;
begin
    //     setlength(a,lena);
    j   :=   0;
    for   i   :=   low(a)   to   high(a)   do
        if   a[i]   =   1   then
            j   :=   j   +   1;

    k   :=   0;
    setlength(arraytemp,   j);
    for   i   :=   low(a)   to   high(a)   do   begin
        if   a[i]   =   1   then   begin
            arraytemp[k]   :=   i;
            k   :=   k   +   1;
        end;
    end;
    result   :=   arraytemp;
end;

//获取二维矩阵a的第i行
function   findrow(a:   mytwodarray;   i:   integer):   myintarray;
var
    j:   integer;
    arraytemp:   myintarray;
begin
    setlength(arraytemp,   length(a[0]));
    for   j   :=   low(a[0])   to   high(a[0])   do
        arraytemp[j]   :=   a[i,   j];
    result   :=   arraytemp;
end;

//获取二维矩阵a的第j列
function   findcol(a:   mytwodarray;   j:   integer):   myintarray;
var
    i:   integer;
    arraytemp:   myintarray;
begin
    setlength(arraytemp,   length(a));
    for   i   :=   low(a)   to   high(a)   do
        arraytemp[i]   :=   a[i,   j];
    result   :=   arraytemp;
end;

//判断数组中是否全为0元素
function   isallzero(a:   myintarray):   boolean;
var
    i:   integer;
begin
    for   i   :=   low(a)   to   high(a)   do   begin
        if   a[i]   =   1   then   begin
            result   :=   false;
            exit;
        end;
    end;

    result   :=   true;
end;

//找出行标i所对应的所有下标
procedure   findallindex(i:   integer;   atwo:   mytwodarray);
var
    j,   k:   integer;
    arraytempc,   arraytempd:   myintarray;
begin

    strlist.add(inttostr(i));

    arraytempc   :=   findrow(atwo,   i);
    if   not   isallzero(arraytempc)   then   begin
        arraytempd   :=   findindex(arraytempc);
        for   j   :=   low(arraytempd)   to   high(arraytempd)   do   begin
            k   :=   arraytempd[j];
            findallindex(k,   atwo);
        end;
    end;

end;

procedure   tform1.button1click(sender:   tobject);
var
    arraytemp1:   myintarray;
    arraytemp2,   arraytemp3,   arraytemp4,   arraytemp5:   myintarray;
    sltemp:   tstringlist;
    i,j,k,l:integer;
begin

//由z生成y,z为初始矩阵
    for   i   :=   low(z)   to   high(z)   do   begin
        arraytemp1   :=   findrow(z,   i);
        if   not   isallzero(arraytemp1)   then   begin
            sltemp   :=   tstringlist.create;
            strlist   :=   tstringlist.create;

            findallindex(i,   z);
            for   k   :=   1   to   strlist.count   -   1   do   begin
                y[i,   strtoint(strlist.strings[k])]   :=   1;
            end;
            sltemp.free;
            strlist.free;
        end;
    end;

end;

这是截取出来的一部分,拿出来希望大家多提意见
主要是那个递归程序findallindex


快速检索

最新资讯
热门点击