用DFS解決八皇后問題(非遞歸)(c#)

需要注意的是蟋字,比如如下代碼:

  Node tmp5 = new Node();
                        tmp5.col = node.col;
                        tmp5.row = node.row;

                        stackk.Push(tmp5);

為什么不是直接 stackk.Push(node);不是更方便嗎
由于本人知識淺薄瓢喉,還沒悟出其中緣由,腦海里依稀認(rèn)為 若是直接“=”賦值便是賦值而不是引用,node的變化應(yīng)該不會改變stackk.Peek()的值才對约巷,如果要修改應(yīng)該要加入ref類似的標(biāo)記,但是事實卻是如果 node=stackk.Peek();修改 node的值之后旱捧,stackk.Peek()值也會發(fā)生改變独郎,所以需要上面代碼這么寫才不會改變棧里面原來的值

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EightQueenNotRecursive
{
    class Program
    {
        int[] a = new int[8];
        int solution = 1;
       public class Node
        {
            public int row;
            public int col;
        }
        public bool isOK(Node node)
        {
            for (int i = 0; i <node.row; i++)
            {
                if (a[i]==node.col|| node.row - i == Math.Abs(a[i]-node.col))
                {
                    return false;
                }
            }
            return true;
        }
        public void Print()
        {
            Console.WriteLine("第{0}種解法:", solution++);
            for (int i = 0; i < 8; i++)
            {
                for (int j = 0; j < 8; j++)
                {
                    if (a[i]==j)
                    {
                        Console.Write("Q");
                    }else
                    {
                        Console.Write("#");
                    }
                }
                Console.WriteLine();
            }
            Console.WriteLine("--------");
        }
        void DSF()
        {
            Node node=new Node();
            Stack stackk = new Stack();
         
            node.row = 0;
            node.col = 0;

            stackk.Push(node);

            while (stackk.Count !=0)
            {
                Node tmp = new Node();
                tmp= (Node)stackk.Peek();
                node.row = tmp.row;
                node.col = tmp.col;
                
       

                while (!isOK(node) && node.col < 8)
                {
                    node.col++;
                }
         
                if (node.col < 8)
                {
                    
                    //forward
                    if (node.row <7)
                    {
               
                        //把ok的節(jié)點放到當(dāng)前層
                        a[node.row] = node.col;
                        stackk.Pop();
   
                        Node tmp4 = new Node();
                        tmp4.col = node.col;
                        tmp4.row = node.row;

                        stackk.Push(tmp4);

                        
                       
                        //進(jìn)入下一層的第一個節(jié)點
                        node.row++;
             
                        node.col = 0;
                  

                        Node tmp3 = new Node();
                        tmp3.col = node.col;
                        tmp3.row = node.row;

                        stackk.Push(tmp3);
                       
                        



                        
                    }
                    else
                    {


                        a[node.row] = node.col;
                        //done
                       
                        Print();
                        node.col++;
                        stackk.Pop();

                       
                        Node tmp6 = new Node();
                        tmp6.col = node.col;
                        tmp6.row = node.row;

                        stackk.Push(tmp6);

                    }
                }
                else
                {

                  stackk.Pop();


                    if (stackk.Count == 0)
                    {

                        return;




                    }

                    Node tmp1 = new Node();
                        tmp1 = (Node)stackk.Peek();
                        node.row = tmp1.row;
                        node.col = tmp1.col;

                        node.col++;
                        stackk.Pop();


                        Node tmp5 = new Node();
                        tmp5.col = node.col;
                        tmp5.row = node.row;

                        stackk.Push(tmp5);



                    
                    //back
                   
                }
            }

        }
        static void Main(string[] args)
        {
            Program p = new Program();
            foreach(int i in p.a)
            {
                p.a[i] = 0;
            }
           

            p.DSF();
            Console.ReadKey();
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市枚赡,隨后出現(xiàn)的幾起案子氓癌,更是在濱河造成了極大的恐慌,老刑警劉巖贫橙,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贪婉,死亡現(xiàn)場離奇詭異,居然都是意外死亡卢肃,警方通過查閱死者的電腦和手機(jī)谓松,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來践剂,“玉大人鬼譬,你說我怎么就攤上這事⊙犯” “怎么了优质?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我巩螃,道長演怎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任避乏,我火速辦了婚禮爷耀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拍皮。我一直安慰自己歹叮,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布铆帽。 她就那樣靜靜地躺著咆耿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪爹橱。 梳的紋絲不亂的頭發(fā)上萨螺,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機(jī)與錄音愧驱,去河邊找鬼慰技。 笑死,一個胖子當(dāng)著我的面吹牛组砚,可吹牛的內(nèi)容都是我干的吻商。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼惫确,長吁一口氣:“原來是場噩夢啊……” “哼手报!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起改化,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤掩蛤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后陈肛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體揍鸟,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年句旱,在試婚紗的時候發(fā)現(xiàn)自己被綠了阳藻。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡谈撒,死狀恐怖腥泥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情啃匿,我是刑警寧澤蛔外,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布蛆楞,位于F島的核電站,受9級特大地震影響夹厌,放射性物質(zhì)發(fā)生泄漏豹爹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一矛纹、第九天 我趴在偏房一處隱蔽的房頂上張望臂聋。 院中可真熱鬧,春花似錦或南、人聲如沸孩等。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瞎访。三九已至腻贰,卻和暖如春吁恍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背播演。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工冀瓦, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人写烤。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓翼闽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親洲炊。 傳聞我的和親對象是個殘疾皇子感局,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,779評論 2 354

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

  • //Clojure入門教程: Clojure – Functional Programming for the J...
    葡萄喃喃囈語閱讀 3,660評論 0 7
  • 10#數(shù)據(jù)類型 合并數(shù)組和非合并數(shù)組 合并數(shù)組:存儲方式是連續(xù)的,中間沒有閑置空間暂衡。例如询微,32bit的寄存器,可以...
    constant007閱讀 32,929評論 0 18
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗狂巢。 張土汪:刷leetcod...
    土汪閱讀 12,744評論 0 33
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理撑毛,服務(wù)發(fā)現(xiàn),斷路器唧领,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • 先生得愿旅宿津門藻雌,有幸拜會大劉先生。戲堂下高唱“”當(dāng)日怎得不走眼斩个,落了你這犟作豺狼口胯杭。”清遠(yuǎn)悠揚受啥,戳心厲耳做个,劉先生...
    賤金屬閱讀 366評論 0 0