不是有公式a【i】【j】等于连加k=1 to n ,
b【i】【k】×c【k】【j】

解决方案 »

  1.   

    program KK;uses
      SysUtils;const
      MAXN = 10;
      ITEMCOUNT = (MAXN div 2)*(MAXN-(MAXN div 2));var
      Num,Num0, v: Longword;
      m, n: Integer;
      s0,s: String;///////////////////////////////////////////////// 转化v为二进制字串s, 返回值为s中'1'的个数
    function ToBinaryStr(v: Longword): Integer;
    var
      v0: Longword;
      p: Integer;
    begin
      s := s0;
      p := 0;
      Result := 0;  while (v > 0) do
      begin
        Inc(p);
        v0 := v shr 1;
        if (v0 shl 1) <> v then
        begin
          s[p] := '1';
          Result := Result + 1;
        end;
        v := v0;
      end;end;// 检查是否为解
    function IsValid: Boolean;
    var
      i, j: Integer;
    begin
      Result := False;  // 此处按原题意应是比较 ToBinaryStr(v) < Max(m, n)
      // 考虑到m取值区间为1..(MAXN div 2),所以总有n=Max(m, n)成立
      if ToBinaryStr(v) < n then Exit;  // 检查行
      for i := 0 to m-1 do
      begin
        for j := 1 to n do
        begin
          if s[i*n + j] = '1' then break;
        end;
        if j > n then Exit;
      end;  // 检查列
      for j := 1 to n do
      begin
        for i := 0 to m-1 do
        begin
          if s[i*n + j] = '1' then break;
        end;
        if i = m then Exit;
      end;  Result := True;
    end;// 按m*n(m行n列)的矩阵输出
    procedure OutputMatrix;
    var
      i: Integer;
    begin
      for i := 0 to m-1 do
      begin
        writeln(Copy(s, i*n + 1, n));
      end;
      writeln;
    end;///////////////////////////////////////////////////begin
      writeln('Start Time: ', TimeToStr(Now));
      writeln;  Num  := 0;  s0 := '';
      for m := 1 to ITEMCOUNT do s0 := s0 + '0';  for m := 1 to (MAXN div 2) do
      begin
        n := MAXN - m;
        Num0 := Num;    for v := 1 to (1 shl (m*n))-1 do
        begin
          if IsValid then
          begin
            OutputMatrix;
            Inc(Num);
          end;
        end;    writeln(m, '*', n, ': ', Num - Num0,' Solution(s)');
        writeln;
      end;  writeln('Total: ', Num,' Solution(s)');  writeln;
      writeln('End Time: ', TimeToStr(Now));
    end.