pascal语言 八皇后问题 哪位大神帮忙看下错误 给个八皇后 回溯 代码 谢...

发布网友 发布时间:2024-11-06 10:02

我来回答

5个回答

热心网友 时间:2024-11-06 10:09

program hh;
const n=8;
var i,j,k:integer;
x:array[1..n] of integer;
function place(k:integer):boolean;
var i:integer;
begin
place:=true;
for i:=1 to k-1 do
if (x[i]=x[k]) or (abs(x[i]-x[k])=abs(i-k)) then
place:=false ;
end;
procedure print;
var i:integer;
begin
for i:=1 to n do write(x[i]:4);
writeln;
end;
begin
k:=1;x[k]:=0;
while k>0 do
begin
x[k]:=x[k]+1;
while (x[k]<=n) and (not place(k)) do x[k]:=x[k]+1;
if x[k]>n then k:=k-1
else if k=n then print
else begin k:=k+1;x[k]:=0 end
end ;
end.
回溯算法的公式如下:

热心网友 时间:2024-11-06 10:08

面继续运行吗。
递归调用与普通的函数调用没有什么区别。函数调用完了就继续往下。
try(i + 1)调用完以后,接着往下走b[j]:=0;

热心网友 时间:2024-11-06 10:10

if i=9 then
begin
sum:=sum+1;
exit;
end else
begin
for j:= 1 to 8 do
begin
if a[j] and b[i-j] and c[i+j] then
begin
x[i]:=j;
a[j]:=false;
b[i-j]:=false;
c[i+j]:=false;
put(i+1);
a[j]:=true;
b[i-j]:=true;
c[i+j]:=true;
这里有错误

热心网友 时间:2024-11-06 10:04

给你个标程,测过了的:
var i,j,n,max:longint;
b:array[1..13]of longint;
v,w:array[-26..26]of longint;
a:array[1..13]of longint;
procedure xun(k:longint);
var i,j:longint;
begin
if k>n then
begin
inc(max);
exit;
end;
for i:=1 to n do
if (b[i]=0)and(v[i+k]=0)and(w[(i-k)]=0) then
begin
b[i]:=1;
v[i+k]:=1;
w[(i-k)]:=1;
a[k]:=i;
xun(k+1);
b[i]:=0;
v[i+k]:=0;
w[(i-k)]:=0;
end;
end;
begin
readln(n);
xun(1);
write(max);
end.

热心网友 时间:2024-11-06 10:10

程序好乱

热心网友 时间:2024-11-06 10:07

program hh;
const n=8;
var i,j,k:integer;
x:array[1..n] of integer;
function place(k:integer):boolean;
var i:integer;
begin
place:=true;
for i:=1 to k-1 do
if (x[i]=x[k]) or (abs(x[i]-x[k])=abs(i-k)) then
place:=false ;
end;
procedure print;
var i:integer;
begin
for i:=1 to n do write(x[i]:4);
writeln;
end;
begin
k:=1;x[k]:=0;
while k>0 do
begin
x[k]:=x[k]+1;
while (x[k]<=n) and (not place(k)) do x[k]:=x[k]+1;
if x[k]>n then k:=k-1
else if k=n then print
else begin k:=k+1;x[k]:=0 end
end ;
end.
回溯算法的公式如下:

热心网友 时间:2024-11-06 10:09

面继续运行吗。
递归调用与普通的函数调用没有什么区别。函数调用完了就继续往下。
try(i + 1)调用完以后,接着往下走b[j]:=0;

热心网友 时间:2024-11-06 10:03

if i=9 then
begin
sum:=sum+1;
exit;
end else
begin
for j:= 1 to 8 do
begin
if a[j] and b[i-j] and c[i+j] then
begin
x[i]:=j;
a[j]:=false;
b[i-j]:=false;
c[i+j]:=false;
put(i+1);
a[j]:=true;
b[i-j]:=true;
c[i+j]:=true;
这里有错误

热心网友 时间:2024-11-06 10:04

程序好乱

热心网友 时间:2024-11-06 10:10

给你个标程,测过了的:
var i,j,n,max:longint;
b:array[1..13]of longint;
v,w:array[-26..26]of longint;
a:array[1..13]of longint;
procedure xun(k:longint);
var i,j:longint;
begin
if k>n then
begin
inc(max);
exit;
end;
for i:=1 to n do
if (b[i]=0)and(v[i+k]=0)and(w[(i-k)]=0) then
begin
b[i]:=1;
v[i+k]:=1;
w[(i-k)]:=1;
a[k]:=i;
xun(k+1);
b[i]:=0;
v[i+k]:=0;
w[(i-k)]:=0;
end;
end;
begin
readln(n);
xun(1);
write(max);
end.

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com