欢迎来到天天文库
浏览记录
ID:57631650
大小:29.00 KB
页数:5页
时间:2020-08-29
《PASCAL-八皇后问题解题报告.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种方法可以解决此问题。现求n皇后的解法。本题可以一个二维数组,放了皇后用1表示,没放皇后用0表示。然后用深度优先搜索设计程序。程序如下:vara:array[1..100,1..100]ofinteger;h,x,y:array[-1
2、00..100]ofboolean;i,k,n,f,m:integer;proceduret(i:integer);//穷举第i个皇后摆放的列varj:integer;//不可定为全程变量beginforj:=1tondoifh[j]andx[i+j]andy[i-j]thenbegina[i,j]:=1;h[j]:=false;x[i+j]:=false;y[i-j]:=false;ifi3、n;end;writeln;end;h[j]:=true;//回溯x[i+j]:=true;y[i-j]:=true;a[i,j]:=0;end;end;beginassign(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(f);close(input);close(outp4、ut);end.后来,我又把它压缩成了一维数组。程序如下:vara:array[1..100]ofinteger;h,x,y:array[-100..100]ofboolean;i,j,k,n,f,m:integer;proceduret(i:integer);beginforj:=1tondoifh[j]andx[i+j]andy[i-j]thenbegina[i]:=j;h[j]:=false;x[i+j]:=false;y[i-j]:=false;ifi5、enwrite('*')elsewrite('-');writeln;end;writeln;end;h[j]:=true;x[i+j]:=true;y[i-j]:=true;end;end;beginassign(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(f);clos6、e(input);close(output);end.但我输入4后,输出的确是0。我想了一下,4皇后有两种结果。我的程序错了。后来,我找到了错误,因为j应该是一个局部变量,不然就无法实现回溯了。修改后的程序如下:vara:array[1..100]ofinteger;h,x,y:array[-100..100]ofboolean;i,k,n,f,m:integer;proceduret(i:integer);varj:integer;beginforj:=1tondoifh[j]andx[i+j]andy[i-j]thenbegina[i]:=j;h[j]:=false;x[i+j]:=fa7、lse;y[i-j]:=false;ifi
3、n;end;writeln;end;h[j]:=true;//回溯x[i+j]:=true;y[i-j]:=true;a[i,j]:=0;end;end;beginassign(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(f);close(input);close(outp
4、ut);end.后来,我又把它压缩成了一维数组。程序如下:vara:array[1..100]ofinteger;h,x,y:array[-100..100]ofboolean;i,j,k,n,f,m:integer;proceduret(i:integer);beginforj:=1tondoifh[j]andx[i+j]andy[i-j]thenbegina[i]:=j;h[j]:=false;x[i+j]:=false;y[i-j]:=false;ifi5、enwrite('*')elsewrite('-');writeln;end;writeln;end;h[j]:=true;x[i+j]:=true;y[i-j]:=true;end;end;beginassign(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(f);clos6、e(input);close(output);end.但我输入4后,输出的确是0。我想了一下,4皇后有两种结果。我的程序错了。后来,我找到了错误,因为j应该是一个局部变量,不然就无法实现回溯了。修改后的程序如下:vara:array[1..100]ofinteger;h,x,y:array[-100..100]ofboolean;i,k,n,f,m:integer;proceduret(i:integer);varj:integer;beginforj:=1tondoifh[j]andx[i+j]andy[i-j]thenbegina[i]:=j;h[j]:=false;x[i+j]:=fa7、lse;y[i-j]:=false;ifi
5、enwrite('*')elsewrite('-');writeln;end;writeln;end;h[j]:=true;x[i+j]:=true;y[i-j]:=true;end;end;beginassign(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(f);clos
6、e(input);close(output);end.但我输入4后,输出的确是0。我想了一下,4皇后有两种结果。我的程序错了。后来,我找到了错误,因为j应该是一个局部变量,不然就无法实现回溯了。修改后的程序如下:vara:array[1..100]ofinteger;h,x,y:array[-100..100]ofboolean;i,k,n,f,m:integer;proceduret(i:integer);varj:integer;beginforj:=1tondoifh[j]andx[i+j]andy[i-j]thenbegina[i]:=j;h[j]:=false;x[i+j]:=fa
7、lse;y[i-j]:=false;ifi
此文档下载收益归作者所有