PASCAL 八皇后问题解题报告

上传人:博****1 文档编号:477547038 上传时间:2023-03-29 格式:DOC 页数:5 大小:29KB
返回 下载 相关 举报
PASCAL 八皇后问题解题报告_第1页
第1页 / 共5页
PASCAL 八皇后问题解题报告_第2页
第2页 / 共5页
PASCAL 八皇后问题解题报告_第3页
第3页 / 共5页
PASCAL 八皇后问题解题报告_第4页
第4页 / 共5页
PASCAL 八皇后问题解题报告_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《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种方案。和网上说的一样!又对了!

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 幼儿/小学教育 > 小学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号