pascal题 在N行N列的数阵中,数K(1〈=K〈=N)在每行和每列中出现且仅出现一次,这样的数阵叫N阶拉丁方阵.例如下图就是一个五阶拉丁方阵.编一程序,从键盘输入N值后,打印出所有不同的N阶拉
来源:学生作业帮助网 编辑:作业帮 时间:2024/06/21 09:42:32
![pascal题 在N行N列的数阵中,数K(1〈=K〈=N)在每行和每列中出现且仅出现一次,这样的数阵叫N阶拉丁方阵.例如下图就是一个五阶拉丁方阵.编一程序,从键盘输入N值后,打印出所有不同的N阶拉](/uploads/image/z/3692942-62-2.jpg?t=pascal%E9%A2%98+%E5%9C%A8N%E8%A1%8CN%E5%88%97%E7%9A%84%E6%95%B0%E9%98%B5%E4%B8%AD%2C%E6%95%B0K%EF%BC%881%E3%80%88%EF%BC%9DK%E3%80%88%EF%BC%9DN%EF%BC%89%E5%9C%A8%E6%AF%8F%E8%A1%8C%E5%92%8C%E6%AF%8F%E5%88%97%E4%B8%AD%E5%87%BA%E7%8E%B0%E4%B8%94%E4%BB%85%E5%87%BA%E7%8E%B0%E4%B8%80%E6%AC%A1%2C%E8%BF%99%E6%A0%B7%E7%9A%84%E6%95%B0%E9%98%B5%E5%8F%ABN%E9%98%B6%E6%8B%89%E4%B8%81%E6%96%B9%E9%98%B5.%E4%BE%8B%E5%A6%82%E4%B8%8B%E5%9B%BE%E5%B0%B1%E6%98%AF%E4%B8%80%E4%B8%AA%E4%BA%94%E9%98%B6%E6%8B%89%E4%B8%81%E6%96%B9%E9%98%B5.%E7%BC%96%E4%B8%80%E7%A8%8B%E5%BA%8F%2C%E4%BB%8E%E9%94%AE%E7%9B%98%E8%BE%93%E5%85%A5N%E5%80%BC%E5%90%8E%2C%E6%89%93%E5%8D%B0%E5%87%BA%E6%89%80%E6%9C%89%E4%B8%8D%E5%90%8C%E7%9A%84N%E9%98%B6%E6%8B%89)
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.