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

            游戲人生

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

            Author: Fox

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

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

            1-3副本

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

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

            在紙上畫了半天,Soft從臺(tái)灣給帶的長(zhǎng)壽都讓我抽完了,總算對(duì)得起這會(huì)兒工夫……

            我的思路大致如下:

            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ī)則都指定了,合法性的確定也就很簡(jiǎn)單了:A%3 != B%3。

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

            A的行號(hào):A/3+8;

            A的列號(hào):A%3+d;

            B的行號(hào):B/3+1;

            B的列號(hào):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)該也不會(huì)低到哪兒吧:-)?

            Feedback

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

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

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

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

            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: 編程之美:中國(guó)象棋將帥問題  回復(fù)  更多評(píng)論   

            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: 編程之美:中國(guó)象棋將帥問題  回復(fù)  更多評(píng)論   

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

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

            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)答案是什么啊,呵呵,查表法。如果反對(duì),請(qǐng)給出一個(gè)比這個(gè)還高效的算法。

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

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

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

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

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

            2008-07-02 13:48 by holly
            博文視點(diǎn)為《編程之美》建立官方qq讀者討論群,號(hào)碼是64955253,歡迎讀者在群內(nèi)進(jìn)行分享、交流、討論。
            内射无码专区久久亚洲| 狠狠色丁香婷婷综合久久来来去 | 久久久久亚洲AV无码网站| 久久久久久国产精品无码超碰| www.久久99| 国产精品久久婷婷六月丁香| 久久久久久亚洲精品成人| 99久久国产主播综合精品| 久久天天躁狠狠躁夜夜2020一| 99久久精品国内| 久久免费视频1| 66精品综合久久久久久久| 亚洲中文字幕久久精品无码APP| 99久久精品国产综合一区| 久久人妻无码中文字幕| 久久综合给合综合久久| 情人伊人久久综合亚洲| 日产精品久久久一区二区| 亚洲国产精品成人久久蜜臀 | 久久久艹| 99久久综合国产精品二区| 国内精品久久人妻互换| 99久久99久久精品国产片果冻| 久久久久综合国产欧美一区二区| 99精品国产在热久久| 国内精品久久久久伊人av| 久久久久se色偷偷亚洲精品av| 国产精品亚洲美女久久久| 久久青草国产手机看片福利盒子| 亚洲精品午夜国产VA久久成人| 亚洲国产日韩欧美久久| 午夜精品久久久久9999高清| 久久免费国产精品| 青青久久精品国产免费看| 久久久久无码国产精品不卡| 国产精品成人99久久久久91gav | 亚洲欧美久久久久9999| 久久综合精品国产一区二区三区| 99久久www免费人成精品| 国产成人香蕉久久久久| 久久伊人色|