• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            Creative Commons License
            本Blog采用 知識共享署名-非商業性使用-禁止演繹 3.0 Unported許可協議 進行許可。 —— Fox <游戲人生>

            游戲人生

            游戲人生 != ( 人生 == 游戲 )
            站點遷移至:http://www.yulefox.com。請訂閱本博的朋友將RSS修改為http://feeds.feedburner.com/yulefox
            posts - 62, comments - 508, trackbacks - 0, articles - 7

            編程之美:中國象棋將帥問題

            Posted on 2008-04-18 00:26 Fox 閱讀(4017) 評論(8)  編輯 收藏 引用 所屬分類: T技術碎語

            Author: Fox

            晚上沒有加班,打游戲打到9點過,后面就又看了一道《編程之美》的題目《中國象棋將帥問題》。

            題目:下過中國象棋的朋友都知道,雙方的“將”和“帥”相隔遙遠,并且它們不能照面。在象棋殘局中,許多高手能利用這一規則走出精妙的殺招。假設棋盤上只有“將”和“帥”二子(如圖1-3所示)(為了下面敘述方便,我們約定用A表示“將”,B表示“帥”):

            1-3副本

            A、B二子被限制在己方3×3的格子里運動。例如,在如上的表格里,A被正方形{d10, f10, d8, f8}包圍,而B被正方形{d3, f3, d1, f1}包圍。每一步,A、B分別可以橫向或縱向移動一格,但不能沿對角線移動。另外,A不能面對B,也就是說,AB不能處于同一縱向直線上(比如Ad10的位置,那么B就不能在d1、d2以及d3)。

            請寫出一個程序,輸出AB所有合法位置。要求在代碼中只能使用一個變量。

            在紙上畫了半天,Soft從臺灣給帶的長壽都讓我抽完了,總算對得起這會兒工夫……

            我的思路大致如下:

            1) 只能使用一個變量nNum ==> 只能使用一個循環,nNum只能用來表示A、B位置的組合,nNum最大為9×9-1=80;

            2) 如何用nNum表示一個A、B位置的組合?

            下圖表示A(紅色)、B(藍色)所在位置:

            6 7 8
            3 4 5
            0 1 2
            6 7 8
            3 4 5
            0 1 2

            nNum%9表示A的位置,nNum/9表示B的位置,如nNum==15,A==6B==1。

            3) 如何確定A、B位置的合法性?

            規則都指定了,合法性的確定也就很簡單了:A%3 != B%3。

            OK,剩下的輸出就很簡單了,為了好看一點,這里希望直接按題目給的圖表示出A、B的位置,如:“A:d10, B:e3”,還有顏色:D。

            A的行號:A/3+8;

            A的列號:A%3+d;

            B的行號:B/3+1;

            B的列號:B%3+d;

            代碼如下(注釋掉的部分只是為了輸出更“漂亮”一點):

             

             1 #include <stdio.h>
             2 //#include <windows.h>
             3 
             4 //HANDLE hStdout;
             5 //CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
             6 //WORD wOldColorAttrs;
             7 
             8 int _tmain(int argc, _TCHAR* argv[])
             9 {
            10     //hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
            11     //GetConsoleScreenBufferInfo(hStdout, &csbiInfo);
            12     //wOldColorAttrs = csbiInfo.wAttributes;
            13 
            14     int nNum = 81;    // nNum表示所有位置(含非法),故nNum = 3 * 3 * 3 * 3
            15     while( nNum-- )
            16     {
            17         if( nNum%9%3 != nNum/9%3 )
            18         {
            19             //SetConsoleTextAttribute(hStdout, FOREGROUND_RED | FOREGROUND_INTENSITY);
            20             printf("A:%x%02d ", nNum%9%3+0xd, nNum%9/3+8);
            21             //SetConsoleTextAttribute(hStdout, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
            22             printf("B:%x%02d  ", nNum/9%3+0xd, nNum/9/3+1);
            23         }
            24         if!(nNum%9) )
            25             printf("\n");
            26     };
            27     printf("\n");
            28     //SetConsoleTextAttribute(hStdout, wOldColorAttrs);
            29     return 0;
            30 }

            輸出:

            點擊查看更清晰原圖:D

            PS: 剛寫完,沒有來得及總結更多,急著向LP炫耀。但上面的思路應該比較清晰了,也不管書上的答案了,反正我感覺我這點代碼效率應該也不會低到哪兒吧:-)?

            Feedback

            # re: 編程之美:中國象棋將帥問題[未登錄]  回復  更多評論   

            2008-04-18 10:52 by cppexplore
            最簡單的方法是先寫個效率低下的程序,把所有結果打印出來。
            然后寫個程序,把結果存在一個表里,用查表法,掃描整個表,挨個打印出來。

            當然也可以一個變量不用,直接把上個程序的輸入結果,打印下。不過這樣就沒意義了。實際的應用一定是需要其中的結果,而查表是最實用的。

            # re: 編程之美:中國象棋將帥問題  回復  更多評論   

            2008-04-18 11:01 by Fox
            我還是中規中矩的按照題目的要求去考慮如何只用一個變量、一個循環實現。寫完了,貼上來才看到書上的幾種方案,本來想寫N>=3的一個統一算法,后面考慮了一下,有點麻煩,也未必能實現,就算了。

            另一個就是本來想加一個宏的實現,效率又高,而且一個變量都不用。就一個OUTPUT。

            #define OUTPUT CALC(3)
            #define CALC(N) ....
            #define ...

            本質上還不如上面的代碼。后面覺得有點偷奸?;奈兜?,算了。

            樓上說的方法也是些“奇技淫巧”了,后來看了下書上的,居然還有用結構體變量的,我心想:成員變量就不是變量了?

            # re: 編程之美:中國象棋將帥問題  回復  更多評論   

            2008-04-18 11:05 by Xin
            好像還不太合題意哪,
            題目不是要輸出A、B所有合法位置。
            當A:e10時 B的位置有好幾個的 B:d1 B:d2 B:d3 B:f1 B:f2 B:f3
            這六個位置。

            # re: 編程之美:中國象棋將帥問題  回復  更多評論   

            2008-04-18 11:15 by Fox
            @Xin
            輸出的都有啊:-),總共81-3×3×3=54種合法位置。
            給的圖也很清楚啊,看不清的話,直接查看原圖吧:D。

            # re: 編程之美:中國象棋將帥問題[未登錄]  回復  更多評論   

            2008-04-18 11:48 by cppexplore
            @Fox
            呵呵,不同的經驗能得出不同的看法。
            我覺得這種題目,查表法不僅不是“奇技淫巧”,反而是最完美的方法。

            就像經常見的面試題:給定一個unsigned char類型變量,輸出按位反轉后的值,比如0x2A=00101010 反轉后就是01010100=0x54

            猜猜這個題目的標準答案是什么啊,呵呵,查表法。如果反對,請給出一個比這個還高效的算法。

            # re: 編程之美:中國象棋將帥問題  回復  更多評論   

            2008-04-19 15:05 by Fox
            @cppexplore
            你看看這個吧:http://book.csdn.net/bookfiles/656/10065620784.shtml
            看看“標準”答案里有沒有:D

            # re: 編程之美:中國象棋將帥問題[未登錄]  回復  更多評論   

            2008-04-19 17:55 by CppExplore
            那里沒有我心目中的標準答案 遺憾啊 呵呵

            # re: 編程之美:中國象棋將帥問題  回復  更多評論   

            2008-07-02 13:48 by holly
            博文視點為《編程之美》建立官方qq讀者討論群,號碼是64955253,歡迎讀者在群內進行分享、交流、討論。
            久久亚洲欧美日本精品| 99久久国产亚洲高清观看2024 | 久久亚洲精品视频| 国产精品热久久毛片| 久久午夜夜伦鲁鲁片免费无码影视| 久久人与动人物a级毛片| …久久精品99久久香蕉国产| 国产叼嘿久久精品久久| 色狠狠久久综合网| 国产99久久久国产精品~~牛| 中文字幕亚洲综合久久菠萝蜜| 国产精品美女久久久| 久久国产免费直播| 久久精品国产精品亚洲| 国产午夜福利精品久久2021| 人妻少妇精品久久| 91精品国产91久久久久久蜜臀| 久久WWW免费人成一看片| 久久av免费天堂小草播放| 久久66热人妻偷产精品9| 青青草原综合久久大伊人| 看全色黄大色大片免费久久久| 99久久精品国产高清一区二区| 日韩欧美亚洲综合久久| 九九久久精品国产| 国产69精品久久久久9999| 狠色狠色狠狠色综合久久| 人妻无码久久一区二区三区免费| 一本色道久久88综合日韩精品 | 99久久国产综合精品成人影院| 久久精品国产亚洲av麻豆蜜芽| 久久人人爽人人爽AV片| 久久99精品久久久久久不卡| 久久综合狠狠综合久久激情 | 四虎影视久久久免费观看| 亚洲国产成人久久综合一| 国产精品久久网| 91精品国产高清久久久久久91| 91精品国产色综久久| 久久精品国产精品亚洲艾草网美妙| 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲 |