八皇后問(wèn)題,C#語(yǔ)言的實(shí)現(xiàn)

(首先 不懂國(guó)際象棋走法的朋友偏形,這里先普及一下國(guó)際象棋的規(guī)則静袖,國(guó)際象棋在一個(gè)8*8格子的棋盤上進(jìn)行,皇后是國(guó)際象棋中威力最大的棋子(估計(jì)是因?yàn)闅W洲很多女皇的原因吧)俊扭,等同于中國(guó)象棋中的車队橙,不過(guò),皇后比車還要厲害 因?yàn)樗€可以斜著走萨惑,上圖就是一種解法)

八皇后問(wèn)題問(wèn)題描述:
八皇后問(wèn)題捐康,是一個(gè)古老而著名的問(wèn)題,是回溯算法的典型案例庸蔼。該問(wèn)題是國(guó)際西洋棋棋手馬克斯·貝瑟爾于1848年提出:在8×8格的國(guó)際象棋上擺放八個(gè)皇后解总,使其不能互相攻擊,即任意兩個(gè)皇后都不能處于同一行姐仅、同一列或同一斜線上花枫,問(wèn)有多少種擺法刻盐。之后陸續(xù)有數(shù)學(xué)家對(duì)其進(jìn)行研究,其中包括高斯和康托(高斯認(rèn)為有76種方案)并且將其推廣為更高級(jí)的n皇后擺放問(wèn)題劳翰。八皇后問(wèn)題的第一個(gè)解是在1850年由弗朗茲·諾克給出的敦锌。諾克也是首先將問(wèn)題推廣到更高級(jí)的n皇后擺放問(wèn)題的人之一。1874年佳簸,S.岡德?tīng)柼岢隽艘粋€(gè)通過(guò)行列式來(lái)求解的方法乙墙,這個(gè)方法后來(lái)又被J.W.L.格萊舍加以改進(jìn)。1854年在柏林的象棋雜志上不同的作者發(fā)表了40種不同的解溺蕉,后來(lái)有人用圖論的方法解出92種結(jié)果。計(jì)算機(jī)發(fā)明后悼做,有多種計(jì)算機(jī)語(yǔ)言可以解決此問(wèn)題疯特。

網(wǎng)上有很多關(guān)于C++和JAVA的算法實(shí)現(xiàn) 下面我們用C#語(yǔ)言實(shí)現(xiàn)這個(gè)問(wèn)題。
C#的解決算法:
using System;
using System.Collections.Generic;
namespace QueensSolution
{
class Program
{
static int count = 0;
static void Main(string[] args)
{
int n = Int32.Parse(Console.ReadLine());
List<int> queen = new List<int>(n);
for (int i = 1; i <= n; i++)
{
queen.Add(0);
}
PutQueen(n, queen, 0);
Console.WriteLine(count);
Console.ReadKey();
}
private static void PutQueen(int n, List<int> queen, int row)
{
for (queen[row] = 1; queen[row] <= n; queen[row]++)
{
if (CheckQueens(queen, row))
{
row++;
if (row < n)
{
PutQueen(n, queen, row);
}
else
{
count++;
for (int i = 0; i < n; i++)
{
Console.Write(queen[i].ToString() + " ");
}
Console.WriteLine();
}
row--;
}
}
}
private static bool CheckQueens(List<int> queen, int row)
{
for (int i = 0; i < row; i++)
{
if (Math.Abs(queen[i] - queen[row]) == Math.Abs(i - row) || queen[i] == queen[row])
{
return false;
}
}
return true;
}
}
}
解釋:
1.要想解出在n*n的棋盤上到底有多少種放置皇后的方法肛走,主要用到兩個(gè)方法漓雅,放皇后的PutQueen方法,檢查皇后的CheckQueens方法朽色。
2.在Main函數(shù)里對(duì)動(dòng)態(tài)數(shù)組進(jìn)行初始化邻吞,這個(gè)動(dòng)態(tài)數(shù)組用來(lái)記錄N皇后中每一行所放置的皇后的位置(1就代表放置在該行第一列,n就代表放置在該行的第n列)葫男。
3.row代表的是八皇后棋盤的每一行抱冷。
4.在Main函數(shù)中對(duì)動(dòng)態(tài)數(shù)組進(jìn)行了一下初始化,這一步是必須的梢褐,否則運(yùn)行結(jié)果報(bào)錯(cuò)旺遮。
5.變量count(解的個(gè)數(shù))聲明在Main函數(shù)外,是靜態(tài)的盈咳。
6.PutQueen方法采用遞歸思想——放皇后(該行中每一列都要放置)耿眉,檢查放皇后的位置是否合理,如果合理則到下一行鱼响,判斷下一行是否存在鸣剪,如果存在——放皇后(該行中每一列都要放置),檢查放皇后的位置是否合理丈积,如果合理則……直到不存在下一行為止每一行都已經(jīng)放置好了皇后筐骇,這時(shí)我們將解的個(gè)數(shù)記錄一下(count++),然后打印該種解法江滨。
7.在遞歸結(jié)束后拥褂,一定要記得返回到上一行(row--),這樣才能讓“for (queen[row] = 1; queen[row] <= n; queen[row]++)”生效牙寞,實(shí)現(xiàn)每一行中的每一列都放置過(guò)皇后饺鹃。一定要注意row--的位置要放在整個(gè)if-else語(yǔ)句塊的后面莫秆!因?yàn)檎麄€(gè)if-else語(yǔ)句塊形成了對(duì)遞歸過(guò)程中狀態(tài)的判斷,有兩種狀態(tài)悔详,第一種狀態(tài)是皇后當(dāng)前在第2到n-1行镊屎,這時(shí)候如果想返回上一行,“row--”的位置其實(shí)可以寫在if語(yǔ)句塊中"PutQueen(n, queen, row);"這一句的后面茄螃;第二種狀態(tài)是皇后當(dāng)前在最后一行(也就是第n行)缝驳,這時(shí)候如果想返回上一行,“row--”的位置其實(shí)可以寫在else語(yǔ)句塊中归苍。因此用狱,我們才將“row--”的位置移到了整個(gè)if-else語(yǔ)句塊的后面。

此時(shí) 我們運(yùn)行程序拼弃,可以得到八皇后的正解92

QQ圖片20160412154725.jpg

當(dāng)然我們使用了遞歸的算法 所以 問(wèn)題可以擴(kuò)展到十皇后到N皇后(當(dāng)然了 一般家用臺(tái)式機(jī)夏伊,十皇后以后的計(jì)算就非常耗時(shí),對(duì)計(jì)算機(jī)的運(yùn)算能力是個(gè)挑戰(zhàn))

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吻氧,一起剝皮案震驚了整個(gè)濱河市溺忧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌盯孙,老刑警劉巖鲁森,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異振惰,居然都是意外死亡歌溉,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門骑晶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)研底,“玉大人,你說(shuō)我怎么就攤上這事透罢“窕蓿” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵羽圃,是天一觀的道長(zhǎng)乾胶。 經(jīng)常有香客問(wèn)我,道長(zhǎng)朽寞,這世上最難降的妖魔是什么木蹬? 我笑而不...
    開(kāi)封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任绽昏,我火速辦了婚禮鸳玩,結(jié)果婚禮上缘琅,老公的妹妹穿的比我還像新娘。我一直安慰自己肘迎,他們只是感情好甥温,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布锻煌。 她就那樣靜靜地躺著,像睡著了一般姻蚓。 火紅的嫁衣襯著肌膚如雪宋梧。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天狰挡,我揣著相機(jī)與錄音捂龄,去河邊找鬼。 笑死加叁,一個(gè)胖子當(dāng)著我的面吹牛倦沧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播它匕,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼展融,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了超凳?” 一聲冷哼從身側(cè)響起愈污,我...
    開(kāi)封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤耀态,失蹤者是張志新(化名)和其女友劉穎轮傍,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體首装,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡创夜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了仙逻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驰吓。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖系奉,靈堂內(nèi)的尸體忽然破棺而出檬贰,到底是詐尸還是另有隱情,我是刑警寧澤缺亮,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布翁涤,位于F島的核電站,受9級(jí)特大地震影響萌踱,放射性物質(zhì)發(fā)生泄漏葵礼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一并鸵、第九天 我趴在偏房一處隱蔽的房頂上張望鸳粉。 院中可真熱鬧,春花似錦园担、人聲如沸届谈。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)疼约。三九已至卤档,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間程剥,已是汗流浹背劝枣。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留织鲸,地道東北人舔腾。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像搂擦,于是被迫代替她去往敵國(guó)和親稳诚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容