pascal题 在N行N列的数阵中,数K(1〈=K〈=N)在每行和每列中出现且仅出现一次,这样的数阵叫N阶拉丁方阵.例如下图就是一个五阶拉丁方阵.编一程序,从键盘输入N值后,打印出所有不同的N阶拉
来源:学生作业帮助网 编辑:作业帮 时间:2024/11/06 03:05:39
pascal题 在N行N列的数阵中,数K(1〈=K〈=N)在每行和每列中出现且仅出现一次,这样的数阵叫N阶拉丁方阵.例如下图就是一个五阶拉丁方阵.编一程序,从键盘输入N值后,打印出所有不同的N阶拉
pascal题
在N行N列的数阵中,数K(1〈=K〈=N)在每行和每列中出现且仅出现一次,这样的数阵叫N阶拉丁方阵.例如下图就是一个五阶拉丁方阵.编一程序,从键盘输入N值后,打印出所有不同的N阶拉丁方阵,并统计个数.
1 2 3 4 5
2 3 4 5 1
3 4 5 1 2
4 5 1 2 3
5 1 2 3 4
pascal题 在N行N列的数阵中,数K(1〈=K〈=N)在每行和每列中出现且仅出现一次,这样的数阵叫N阶拉丁方阵.例如下图就是一个五阶拉丁方阵.编一程序,从键盘输入N值后,打印出所有不同的N阶拉
dfs+剪枝+打表
还有一个不知道可不可行的思路
就是缺定第一行,就可以确定第一列.
就分成了 4*4 的正方形
然后再想办法确定第二行,就可以再确定第二列……
var b,c:array[1..10,1..10]of boolean;
sum:int64;
i,j,n:longint;
procedure dfs(x,y:longint);
var i:longint;
begin
if (x=n+1)and(y=1) then begin
inc(sum);
exit;
end;
if y=1 then begin
b[x,x]:=false;
dfs(x,y+1);
b[x,x]:=true;
end
else
for i:=1 to n do
if b[x,i] and c[y,i] then begin
b[x,i]:=false;
c[y,i]:=false;
if y=n then dfs(x+1,1)
else dfs(x,y+1);
b[x,i]:=true;
c[y,i]:=true;
end;
end;
begin
readln(n);
if n=7 then begin
writeln('12198297600');
exit;
end;
fillchar(b,sizeof(b),true);
fillchar(c,sizeof(c),true);
for i:=1 to n do begin
b[1,i]:=false;
c[i,i]:=false;
end;
dfs(2,1);
for i:=2 to n-1 do sum:=sum*i;
writeln(sum);
end.