求八皇后pascal程序及详细解法,本人较笨,请解释得清晰一点,且本人没学过集合,记录,文件,指针,麻... 20
求八皇后pascal程序及详细解法,本人较笨,请解释得清晰一点,且本人没学过集合,记录,文件,指针,麻烦了......
求八皇后pascal程序及详细解法,本人较笨,请解释得清晰一点,且本人没学过集合,记录,文件,指针,麻烦了 ...
展开
1个回答
展开全部
八皇后主要用DFS来解决,集合、记录、指针等用不到。
程序:
var
x,y,z:array[1..25]of boolean;
i,n,j,t:longint;
function ok(d,i:longint):boolean;
begin
ok:=true;
if (d<i) and not(y[i-d+1])then ok:=false; //判断左斜列
if (d=i) and not(y[1])then ok:=false;
if (d>i) and not(y[d-i+n])then ok:=false;
if (d>n-i+1) and not(z[n+d-(n-i+1)])then ok:=false; //判断右斜列
if (d=n-i+1) and not(z[1])then ok:=false;
if (d<n-i+1) and not(z[n-i+2-d])then ok:=false;
end;
procedure dfs(d:longint);
var
i:longint;
begin
if d=n+1 then
begin
inc(t); //找到就加一
exit;
end;
for i:=1 to n do
if ok(d,i)and (x[i]) then
begin
x[i]:=false;
if d<i then y[i-d+1]:=false; //记录
if d=i then y[1]:=false;
if d>i then y[d-i+n]:=false;
if d>n-i+1 then z[n+d-(n-i+1)]:=false;
if d=n-i+1 then z[1]:=false;
if d<n-i+1 then z[n-i+2-d]:=false;
dfs(d+1);
x[i]:=true; //回溯
if d<i then y[i-d+1]:=true;
if d=i then y[1]:=true;
if d>i then y[d-i+n]:=true;
if d>n-i+1 then z[n+d-(n-i+1)]:=true;
if d=n-i+1 then z[1]:=true;
if d<n-i+1 then z[n-i+2-d]:=true;
end;
end;
begin
fillchar(x,sizeof(x),true);
fillchar(y,sizeof(y),true);
fillchar(z,sizeof(z),true);
read(n);
dfs(1);
writeln(t);
end.
这是n皇后,输入8就可以了
程序:
var
x,y,z:array[1..25]of boolean;
i,n,j,t:longint;
function ok(d,i:longint):boolean;
begin
ok:=true;
if (d<i) and not(y[i-d+1])then ok:=false; //判断左斜列
if (d=i) and not(y[1])then ok:=false;
if (d>i) and not(y[d-i+n])then ok:=false;
if (d>n-i+1) and not(z[n+d-(n-i+1)])then ok:=false; //判断右斜列
if (d=n-i+1) and not(z[1])then ok:=false;
if (d<n-i+1) and not(z[n-i+2-d])then ok:=false;
end;
procedure dfs(d:longint);
var
i:longint;
begin
if d=n+1 then
begin
inc(t); //找到就加一
exit;
end;
for i:=1 to n do
if ok(d,i)and (x[i]) then
begin
x[i]:=false;
if d<i then y[i-d+1]:=false; //记录
if d=i then y[1]:=false;
if d>i then y[d-i+n]:=false;
if d>n-i+1 then z[n+d-(n-i+1)]:=false;
if d=n-i+1 then z[1]:=false;
if d<n-i+1 then z[n-i+2-d]:=false;
dfs(d+1);
x[i]:=true; //回溯
if d<i then y[i-d+1]:=true;
if d=i then y[1]:=true;
if d>i then y[d-i+n]:=true;
if d>n-i+1 then z[n+d-(n-i+1)]:=true;
if d=n-i+1 then z[1]:=true;
if d<n-i+1 then z[n-i+2-d]:=true;
end;
end;
begin
fillchar(x,sizeof(x),true);
fillchar(y,sizeof(y),true);
fillchar(z,sizeof(z),true);
read(n);
dfs(1);
writeln(t);
end.
这是n皇后,输入8就可以了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询