熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

基於Delphi的“八皇後”問題動態實現[1]

2013-11-11 21:06:26  來源: Delphi編程 
    摘要 對於八皇後問題的實現如果結合動態的圖形演示則可以使算法的描述更形象更生動使教學能產生良好的效果

  關鍵詞 八皇後問題 沖突 數據結構 線程類

  八皇後問題是一個古老而著名的問題是回溯算法的典型例題該問題是十九世紀著名的數學家高斯年提出X格的國際象棋上擺放八個皇後使其不能互相攻擊即任意兩個皇後都不能處於同一行同一列或同一斜線上問有多少種擺法

  下面用delphi實現的八皇後問題的動態圖形程序能夠演示全部的組解八皇後問題動態圖形的實現主要應解決以下幾個問題

  沖突

  包括行兩條對角線

  ()列規定每一列放一個皇後不會造成列上的沖突

  ()行當第i行被某個皇後占領後則同一行上的所有空格都不能再放皇後要把以i

  為下標的標記置為被占領狀態

  ()對角線對角線有兩個方向在同一對角線上的所有點(設下標為(ij))要麼(i+j)是常數要麼(ij)是常數因此當第i個皇後占領了第j列後要同時把以(i+j)(ij)為下標的標記置為被占領狀態

  數據結構

  為了對該問題的執行過程進行控制需將該問題中的主要數據及相應的操作定義成一個線程類方法在New菜單中單擊Other選項在對話框中選Thread object在classs name中輸線程類的類名具體定義如下

type
 Tbhh = class(TThread)

private
 a:array[]of integer;
 tt:integer;
 qc:Tbitmap;
 procedure prt;
 function pd(ij:integer):boolean;
 procedure hsu(i:integer);
protected
 procedure Execute; override;
public
 constructor create(flag:boolean);
end;

var
 dstep:boolean;
  解決沖突的具體函數

function pd(ij:integer):boolean;
 var ij:integer;
begin
 pd:=true;
 if i<>
 then begin for i:= to i do for j:= to do
 if a[ij]=
 then begin if j=j then pd:=false else if abs(ii)=abs(jj)then pd:=false end
 end
end;
  棋盤與棋子的圖片(需要用畫圖程序作出)生成裝入及顯示過程如下

procedure TFormPaintBoxClick(Sender: TObject);
 var q:tbitmap;
begin
 q:=tbitmapcreate;
 qloadfromfile(e:\八皇後\backimgbmp);
 paintboxcanvasDraw(q);
end;
end

[]  []  


From:http://tw.wingwit.com/Article/program/Delphi/201311/8516.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.