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.
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.