• <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 <游戲人生>

            游戲人生

            游戲人生 != ( 人生 == 游戲 )
            站點遷移至: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技術(shù)碎語

            Author: Fox

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

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

            1-3副本

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

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

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

            我的思路大致如下:

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

            2) 如何用nNum表示一個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,剩下的輸出就很簡單了,為了好看一點,這里希望直接按題目給的圖表示出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: 剛寫完,沒有來得及總結(jié)更多,急著向LP炫耀。但上面的思路應(yīng)該比較清晰了,也不管書上的答案了,反正我感覺我這點代碼效率應(yīng)該也不會低到哪兒吧:-)?

            Feedback

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

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

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

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

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

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

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

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

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

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

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

            # 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)驗?zāi)艿贸霾煌目捶ā?
            我覺得這種題目,查表法不僅不是“奇技淫巧”,反而是最完美的方法。

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

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

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

            2008-04-19 15:05 by Fox
            @cppexplore
            你看看這個吧: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
            博文視點為《編程之美》建立官方qq讀者討論群,號碼是64955253,歡迎讀者在群內(nèi)進(jìn)行分享、交流、討論。
            久久久久久久久久久精品尤物| 久久影院综合精品| 久久精品国产秦先生| 久久香蕉国产线看观看精品yw| 无码国内精品久久综合88| 亚洲欧洲久久av| 久久精品国产男包| 麻豆成人久久精品二区三区免费| 亚洲午夜久久久久妓女影院| 久久人人添人人爽添人人片牛牛| 欧美黑人激情性久久| 国产成人精品综合久久久| 久久AV高潮AV无码AV| 久久久无码一区二区三区| 精品久久久久久中文字幕| 国产福利电影一区二区三区久久老子无码午夜伦不 | 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区 | 久久久国产视频| 天堂久久天堂AV色综合| 无码人妻精品一区二区三区久久 | 精品久久久久久成人AV| 久久夜色tv网站| 久久人人爽人人爽AV片| 国内高清久久久久久| 久久av无码专区亚洲av桃花岛| 国产精品久久久久久一区二区三区| 日韩精品国产自在久久现线拍| 久久一区二区三区99| 亚洲va中文字幕无码久久不卡| 91精品国产91久久久久久青草| 久久国产热这里只有精品| 伊人久久精品无码二区麻豆| 久久综合丝袜日本网| 中文字幕精品久久| 伊人久久精品线影院| 久久久亚洲裙底偷窥综合 | 久久伊人中文无码| 东京热TOKYO综合久久精品| 香蕉久久夜色精品国产2020| 国产精品久久永久免费| 久久无码中文字幕东京热|