《PASCAL 八皇后问题解题报告》由会员分享,可在线阅读,更多相关《PASCAL 八皇后问题解题报告(5页珍藏版)》请在金锄头文库上搜索。
1、 八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种方法可以解决此问题。 现求n皇后的解法。本题可以一个二维数组,放了皇后用1表示,没放皇后用0表示。然后用深度优先搜索设计程序。程序如下:var a:array1.100,1.100of integer; h,x,y:array-1
2、00.100of boolean; i,k,n,f,m:integer;procedure t(i:integer); /穷举第i个皇后摆放的列var j:integer; /不可定为全程变量begin for j:=1 to n do if hj and xi+j and yi-j then begin ai,j:=1; hj:=false; xi+j:=false; yi-j:=false; if in then t(i+1) else begin inc(f); for k:=1 to n do begin for m:=1 to n do if ak,m=1 then write(*)
3、 else write(-); writeln; end; writeln; end; hj:=true; /回溯 xi+j:=true; yi-j:=true; ai,j:=0; end;end;begin assign(input,nhuanghou.in); assign(output,nhuanghou.out); reset(input); rewrite(output); readln(n); fillchar(h,sizeof(h),true); fillchar(y,sizeof(y),true); fillchar(x,sizeof(x),true); t(1); write
4、(f); close(input); close(output);end.后来,我又把它压缩成了一维数组。程序如下:var a:array1.100of integer; h,x,y:array-100.100of boolean; i,j,k,n,f,m:integer;procedure t(i:integer);begin for j:=1 to n do if hj and xi+j and yi-j then begin ai:=j; hj:=false; xi+j:=false; yi-j:=false; if in then t(i+1) else begin inc(f); f
5、or k:=1 to n do begin for m:=1 to n do if ak=m then write(*) else write(-); writeln; end; writeln; end; hj:=true; xi+j:=true; yi-j:=true; end;end;begin assign(input,nhuanghou.in); assign(output,nhuanghou.out); reset(input); rewrite(output); readln(n); fillchar(h,sizeof(h),true); fillchar(y,sizeof(y)
6、,true); fillchar(x,sizeof(x),true); t(1); write(f); close(input); close(output);end.但我输入4后,输出的确是0。我想了一下,4皇后有两种结果。我的程序错了。后来,我找到了错误,因为j应该是一个局部变量,不然就无法实现回溯了。修改后的程序如下:var a:array1.100of integer; h,x,y:array-100.100of boolean; i,k,n,f,m:integer;procedure t(i:integer);var j:integer;begin for j:=1 to n do
7、if hj and xi+j and yi-j then begin ai:=j; hj:=false; xi+j:=false; yi-j:=false; if in then t(i+1) else begin inc(f); for k:=1 to n do begin for m:=1 to n do if ak=m then write(*) else write(-); writeln; end; writeln; end; hj:=true; xi+j:=true; yi-j:=true; end;end;begin assign(input,nhuanghou.in); ass
8、ign(output,nhuanghou.out); reset(input); rewrite(output); readln(n); fillchar(h,sizeof(h),true); fillchar(y,sizeof(y),true); fillchar(x,sizeof(x),true); t(1); write(f); close(input); close(output);end.我输入了4。结果是:- * - - - - - * * - - - - - * - - - * - * - - - - - - * - * - - 2果然对了!我又输入了8,输出了92种方案。和网上说的一样!又对了!