八皇后问题递归PASCAL代码,有思路,好的话追分
2个回答
展开全部
我表示前面那个兄弟的程序复杂了些,稍稍改了一下print,并加了自己的一些理解
VAR
x:ARRAY[1..8]OF integer;
a,b,c:ARRAY[-7..16]OF boolean; {-7,16是观察棋盘得出的边界,看完后面就明白了}
i:integer;
PROCEDURE print;
VAR k:integer;
BEGIN
for k:=1 to 8 do
write(x[k]:4);
writeln;
end;
PROCEDURE try(:integer); {这里是核心了}
VAR j:integer;
BEGIN
FOR j:=1 TO 8 DO {j是棋盘的纵坐标,i是横坐标,画图可以看出只需循环j. }
IF a[j]AND b[i+j]AND c[i-j] {判断该格子是否被占, i+j和i-j都是这一个的斜线方向,自己画图就懂,若被占了直接返回上面的循环..该格子为空则继续下面 }
THEN BEGIN
x[i]:=j; {记录第i个皇后的纵坐标}
a[j]:=false;b[j+i]:=false;c[i-j]:=false; {将该格子占领}
IF i<8 {,i=8时,即排到 第八个皇后的时候,就打印棋盘}
THEN try(i+1) {没到第八个时则继续递归, 求i+1的皇后的位置,如果可以就进行,不行 就回溯}
ELSE print;
a[j]:=true;b[i+j]:=true;c[i-j]:=true;{注意:这是回溯!}
END;
END;
BEGIN
FOR i:=-7 TO 16 DO
BEGIN
a[i]:=true;b[i]:=true;c[i]:=true
END;
try(1)
END.
VAR
x:ARRAY[1..8]OF integer;
a,b,c:ARRAY[-7..16]OF boolean; {-7,16是观察棋盘得出的边界,看完后面就明白了}
i:integer;
PROCEDURE print;
VAR k:integer;
BEGIN
for k:=1 to 8 do
write(x[k]:4);
writeln;
end;
PROCEDURE try(:integer); {这里是核心了}
VAR j:integer;
BEGIN
FOR j:=1 TO 8 DO {j是棋盘的纵坐标,i是横坐标,画图可以看出只需循环j. }
IF a[j]AND b[i+j]AND c[i-j] {判断该格子是否被占, i+j和i-j都是这一个的斜线方向,自己画图就懂,若被占了直接返回上面的循环..该格子为空则继续下面 }
THEN BEGIN
x[i]:=j; {记录第i个皇后的纵坐标}
a[j]:=false;b[j+i]:=false;c[i-j]:=false; {将该格子占领}
IF i<8 {,i=8时,即排到 第八个皇后的时候,就打印棋盘}
THEN try(i+1) {没到第八个时则继续递归, 求i+1的皇后的位置,如果可以就进行,不行 就回溯}
ELSE print;
a[j]:=true;b[i+j]:=true;c[i-j]:=true;{注意:这是回溯!}
END;
END;
BEGIN
FOR i:=-7 TO 16 DO
BEGIN
a[i]:=true;b[i]:=true;c[i]:=true
END;
try(1)
END.
展开全部
PROGRAM e710;
VAR
x:ARRAY[1..8]OF integer;
a,b,c:ARRAY[-7..16]OF boolean; {-7,16是观察棋盘得出的边界,看完后面就明白了}
i,g:integer;
PROCEDURE print(Var g:integer); {打印棋盘}
VAR k,j,h:integer;
BEGIN
IF g MOD 16=0
THEN readln; {每输出16个棋盘暂停一次,方便检查.}
writeln('means',g); {输出有第g种方法.可有可无.}
FOR j:=8 DOWNTO 1 DO
BEGIN
FOR k:=1 TO 16 DO write('_');
writeln;
FOR k:=1 TO 8 DO
IF x[k]=j
THEN BEGIN
FOR h:=1 TO k-1 DO write(' |');
write('Q|'); {Q代表皇后}
FOR h:=k TO 7 DO write(' |')
END;
writeln
END;
inc(g)
END;
PROCEDURE try(i:integer); {这里是核心了}
VAR j:integer;
BEGIN
FOR j:=1 TO 8 DO {j是棋盘的纵坐标,i是横坐标,画图可以看出只需循环j. }
IF a[j]AND b[i+j]AND c[i-j] {判断该格子是否被占, i+j和i-j都是这一个的斜线方向,自己画图就懂,若被占了直接返回上面的循环..该格子为空则继续下面 }
THEN BEGIN
x[i]:=j; {记录第i个皇后的纵坐标}
a[j]:=false;b[j+i]:=false;c[i-j]:=false; {将该格子占领}
IF i<8 {,i=8时,即排到 第八个皇后的时候,就打印棋盘}
THEN try(i+1) {没到第八个时则继续递归, 求i+1的皇后的位置}
ELSE print(g);
a[j]:=true;b[i+j]:=true;c[i-j]:=true
END;
END;
BEGIN
FOR i:=-7 TO 16 DO
BEGIN
a[i]:=true;b[i]:=true;c[i]:=true
END;
g:=1;
try(1)
END.
VAR
x:ARRAY[1..8]OF integer;
a,b,c:ARRAY[-7..16]OF boolean; {-7,16是观察棋盘得出的边界,看完后面就明白了}
i,g:integer;
PROCEDURE print(Var g:integer); {打印棋盘}
VAR k,j,h:integer;
BEGIN
IF g MOD 16=0
THEN readln; {每输出16个棋盘暂停一次,方便检查.}
writeln('means',g); {输出有第g种方法.可有可无.}
FOR j:=8 DOWNTO 1 DO
BEGIN
FOR k:=1 TO 16 DO write('_');
writeln;
FOR k:=1 TO 8 DO
IF x[k]=j
THEN BEGIN
FOR h:=1 TO k-1 DO write(' |');
write('Q|'); {Q代表皇后}
FOR h:=k TO 7 DO write(' |')
END;
writeln
END;
inc(g)
END;
PROCEDURE try(i:integer); {这里是核心了}
VAR j:integer;
BEGIN
FOR j:=1 TO 8 DO {j是棋盘的纵坐标,i是横坐标,画图可以看出只需循环j. }
IF a[j]AND b[i+j]AND c[i-j] {判断该格子是否被占, i+j和i-j都是这一个的斜线方向,自己画图就懂,若被占了直接返回上面的循环..该格子为空则继续下面 }
THEN BEGIN
x[i]:=j; {记录第i个皇后的纵坐标}
a[j]:=false;b[j+i]:=false;c[i-j]:=false; {将该格子占领}
IF i<8 {,i=8时,即排到 第八个皇后的时候,就打印棋盘}
THEN try(i+1) {没到第八个时则继续递归, 求i+1的皇后的位置}
ELSE print(g);
a[j]:=true;b[i+j]:=true;c[i-j]:=true
END;
END;
BEGIN
FOR i:=-7 TO 16 DO
BEGIN
a[i]:=true;b[i]:=true;c[i]:=true
END;
g:=1;
try(1)
END.
参考资料: http://zhidao.baidu.com/question/229070573.html?an=0&si=1
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询