• <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采用 知識共享署名-非商業(yè)性使用-禁止演繹 3.0 Unported許可協(xié)議 進(jìn)行許可。 —— Fox <游戲人生>

            游戲人生

            游戲人生 != ( 人生 == 游戲 )
            站點(diǎn)遷移至: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 閱讀(4018) 評論(8)  編輯 收藏 引用 所屬分類: T技術(shù)碎語

            Author: Fox

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

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

            1-3副本

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

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

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

            我的思路大致如下:

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

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

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

            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位置的合法性?

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

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

            A的行號:A/3+8;

            A的列號:A%3+d;

            B的行號:B/3+1;

            B的列號:B%3+d;

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

             

             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 }

            輸出:

            點(diǎn)擊查看更清晰原圖:D

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

            Feedback

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

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

            當(dāng)然也可以一個(gè)變量不用,直接把上個(gè)程序的輸入結(jié)果,打印下。不過這樣就沒意義了。實(shí)際的應(yīng)用一定是需要其中的結(jié)果,而查表是最實(shí)用的。

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

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

            另一個(gè)就是本來想加一個(gè)宏的實(shí)現(xiàn),效率又高,而且一個(gè)變量都不用。就一個(gè)OUTPUT。

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

            本質(zhì)上還不如上面的代碼。后面覺得有點(diǎn)偷奸耍滑的味道,算了。

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

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

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

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

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

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

            2008-04-18 11:48 by cppexplore
            @Fox
            呵呵,不同的經(jīng)驗(yàn)?zāi)艿贸霾煌目捶ā?
            我覺得這種題目,查表法不僅不是“奇技淫巧”,反而是最完美的方法。

            就像經(jīng)常見的面試題:給定一個(gè)unsigned char類型變量,輸出按位反轉(zhuǎn)后的值,比如0x2A=00101010 反轉(zhuǎn)后就是01010100=0x54

            猜猜這個(gè)題目的標(biāo)準(zhǔn)答案是什么啊,呵呵,查表法。如果反對,請給出一個(gè)比這個(gè)還高效的算法。

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

            2008-04-19 15:05 by Fox
            @cppexplore
            你看看這個(gè)吧:http://book.csdn.net/bookfiles/656/10065620784.shtml
            看看“標(biāo)準(zhǔn)”答案里有沒有:D

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

            2008-04-19 17:55 by CppExplore
            那里沒有我心目中的標(biāo)準(zhǔn)答案 遺憾啊 呵呵

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

            2008-07-02 13:48 by holly
            博文視點(diǎn)為《編程之美》建立官方qq讀者討論群,號碼是64955253,歡迎讀者在群內(nèi)進(jìn)行分享、交流、討論。
            久久只有这精品99| 伊人久久大香线蕉av不卡| 无码国内精品久久综合88 | 亚洲AⅤ优女AV综合久久久| 国产精品久久久久影院色| 中文无码久久精品| 蜜臀av性久久久久蜜臀aⅴ| 久久久久久久女国产乱让韩| 亚洲精品国产综合久久一线| 天堂无码久久综合东京热| 久久久久99精品成人片三人毛片| 国产亚洲成人久久| 一级做a爰片久久毛片毛片| 伊人久久成人成综合网222| 久久精品国产亚洲αv忘忧草| 99久久国产精品免费一区二区| 综合人妻久久一区二区精品| 亚洲国产精品无码久久一线| 久久丫精品国产亚洲av| 久久精品国产一区| 久久丝袜精品中文字幕| 久久久久久精品成人免费图片| 久久久久久毛片免费播放| 久久综合九色综合精品| 日本加勒比久久精品| 色婷婷综合久久久中文字幕| 免费观看成人久久网免费观看| 久久综合九色欧美综合狠狠| 午夜天堂精品久久久久| 美女写真久久影院| 久久精品国产亚洲AV蜜臀色欲| www久久久天天com| 亚洲精品无码久久久久AV麻豆| 国产精品久久久久久一区二区三区| 精品久久人人妻人人做精品| 精品综合久久久久久98| 国内精品久久久久久久亚洲| 午夜精品久久久久久久久| 久久久久国产一区二区三区| 久久久噜噜噜久久熟女AA片 | 99久久精品毛片免费播放|