掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
エイトクイーンのプログラムを書くには? (ID:9827)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
まあ、アルゴリズムというのは、定石ですし。解答を見て勉強になるということもありますからね。 ただ、この程度はすぐ思いつくようにしておいたほうが良いです。 # プログラマ/SEなどを目指していないのであれば、単位さえ取れれば問題ないんですが^^; そのままでは動きません。 変数の宣言位置や、関数の宣言位置はDelphiの構文に則って書いてください。 ここに書くのは主要部分のみです。 [変数宣言] ans: Integer; // 解の何番目か。 Row: array[0..N-1] of Boolean;// 各行に置ける、クイーンの位置(0~7)。埋まっていたらTrue Col: array[0..N-1] of Integer;// 各行に置ける、クイーンの位置(0~7)。位置が入る。 RU: array[0..2*N-2] of Boolean; // 右上から左下に向かう斜めの位置(0~15)。埋まっていたらTrue LU: array[0..2*N-2] of Boolean; // 左上から右下に向かう斜めの位置(0~15)。埋まっていたらTrue //関数宣言 procedure NQueen(i: integer); procedure PutQueen; 変数の宣言と関数の宣言は、TForm1のメンバとして。 また、TStringGrid(名前はStringGrid1)と、TButton(名前はButton1)をFormに貼り付け、Button1のOnClickイベントを定義します。 関数の実装は以下の通り。 procedure TForm1.Button1Click(Sender: TObject); var i: integer; begin //初期化 for i := 0 to N - 1 do begin Row[i] := False; end; for i := 0 to 2 * N - 2 do begin RU[i] := False; LU[i] := False; end; //検索 ans := 0; NQueen(0); end; procedure TForm1.NQueen(i: integer); var j: integer; begin for j := 0 to N - 1 do begin // 置ける? if (not Row[j]) and (not RU[i + j]) and (not LU[N - 1 - i + j]) then begin //置けるので置く Col[i] := j; if i < N - 1 then begin //まだ置き終わっていない Row[j] := True; RU[i + j] := True; LU[N - 1 - i + j] := True; NQueen(i + 1); Row[j] := False; RU[i + j] := False; LU[N - 1 - i + j] := False; end else begin //置き終わった PutQueen; end; end; end; end; procedure TForm1.PutQueen; var i, j: integer; begin // printf("\n解 %d\n", ++solution); for i := 0 to N - 1 do begin for j := 0 to N - 1 do begin if Col[i] = j then begin StringGrid1.Cells[i, j] := '○'; end else begin StringGrid1.Cells[i, j] := ' '; end; end; end; inc(ans); ShowMessage(Format('解%d', [ans])); end;
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.