野比 发表于 2007-6-16 11:57

[全民编程]76道高难度C++练习题.含NOI竞赛题.欢迎挑战

<P>偶然从朋友那里搞到的, 名字是&lt;&lt;C++入门题&gt;&gt;<br>题目都相当的经典. 还有不少是NOI的考试题.<br>1 - 20题作为热身(见2楼), 越往后越难, 完整版(76道)请到1楼楼底下载.<br></P>
<P><FONT color=blue>[quote]请解决问题后, 不要吝惜你的才华, 把解题方法跟贴, 大家共同学习提高.</FONT><FONT color=blue>[/quote]</FONT></P>
<P>统计时间: 2007-10-10 19:29[/quote]<br>[quote]<FONT color=red>目前已完成题目</FONT><FONT color=#000000>(按发帖时间先后排序)</FONT></P>
<P>题号        完成人                楼层<br>---------------------------------------------<br>2           百年不亮              3<br>5           HCL                   4 <br>20          aipb2007              5,6  <br>17          游乐园/aipb2007       18/20      <br>6           HCL                   26,27          <br>16          jiaju111              33           <FONT color=red>讨论完成, 未编程</FONT><br>11          aipb2007              46   <br>75          HJin                  48           <FONT color=red>不符题干, 参考</FONT><br><FONT color=#000000>49          HJin                  49          <br>48          HJin                  61           <br>10          HJin                  62           * 218楼(blueboy82006),236楼(远去的列车)修改<br></FONT>13          HJin                  63            <br>17          HJin                  65          <br>1           HJin                  67          <br>3           tianma8778            69           [color=red]有缺陷, 供参考[/color]<br>24          HJin                  71          <br>1           kai                   77           另一种解法<br>2           kai                   79           数字电路分析法<br>4           HJin                  80          <br>3           kai                   81           # With analysis<br>19          HJin                  83          <br>3           laigaoat2005          69                <br>37          HJin                  103          162楼补充说明(smartwind)<br>67          HJin                  104          <br>74          HJin                  105          <br>4           wfpb                  107          * + (kai指出, 见117楼)<br>3           smartwind             108          *<br>9           smartwind             109          *<br>8           wfpb                  110          *<br>3           zkkpkk                111          *<br>12          wfpb                  112          *<br>75          smartwind             113          *<br>37          weishj                114          *<br>41          zkkpkk                115          * 166楼改进(smartwind)<br>6           zkkpkk                118          * 130楼补充蛇形填数<br>65          weishj                124          *<br>14          huozoo                126          @ 正确<br>7           zkkpkk                137          *<br>76          HJin                  138          *<br>4           天空の城              140          *<br>58          HJin                  141          *<br>9           zkkpkk                142          *<br>13          zkkpkk                144          *<br>57          HJin                  147          *<br>53          HJin                  148          *<br>22          HJin                  149          *<br>43          zkkpkk                150          *<br>21          HJin                  152          *<br>31          smartwind             160          * 164楼补充(HJin) 165楼补充(smartwind)<br>34          smartwind             161          # 分析<br>45          smartwind             172          *<br>2           zhchchqihu            194,193      * 2种方法<br>3           freshman42            196          *<br>?           blueboy82006          208          *<br>2           卧龙孔明              209,210      * 2种方法<br>1           hkice                 211          *<br>5           hkice                 212          *<br>3           miaomiao0403          214          *<br>10          ml232528              215          * 指出62楼10题错误<br>55          远去的列车            220          *<br>48          远去的列车            222          *<br>14          huozoo                223          * 解答者本人不确定<br>2,3         xjlsgcjdtc            228,229      *<br>3           qq598369              230          *<br>3           远去的列车            232          *<br>3           曦木                  233          *<br>6           远去的列车            234          *<br>7           海子星竹              239          *<br>3           且行且珍惜            240          *<br>[/quote]<br>[quote]注:<br>*    未测试 (Not tested)<br>@    已测试 (Tested)<br>+    Bug<br>#    无源代码 (No code)<br>[/quote]<br>[quote]完整版(76道)下载[attach]22592[/attach][/quote]</P><br>
[align=right][color=#000066][此贴子已经被作者于2007-10-10 19:29:50编辑过][/color][/align]

野比 发表于 2007-6-16 11:58

<P>[quote]No.1 - 20 热身题[/quote]<br>[quote]  1.  给定等式  A B C D E     其中每个字母代表一个数字,且不同数字对应不<br>                    D F G     同字母。编程求出这些数字并且打出这个数字的<br>             +      D F G     算术计算竖式。</P>
<P>             ───────</P>
<P>                X Y Z D E</P>
<P>  2. A、B、C、D、E五名学生有可能参加计算机竞赛,根据下列条件判断哪些<br>  人参加了竞赛:</P>
<P>   (1)A参加时,B也参加;</P>
<P>   (2)B和C只有一个人参加;</P>
<P>   (3)C和D或者都参加,或者都不参加;</P>
<P>   (4)D和E中至少有一个人参加;</P>
<P>   (5)如果E参加,那么A和D也都参加。</P>
<P>  3. 打印一个 N*N 的方阵,N为每边           N=15  打印出下面图形<br>字符的个数(3<N<20), 要求最                TTTTTTTTTTTTTTT<br>外一层为"T", 第二层为"J", 从第三层                TJJJJJJJJJJJJJT<br>起每层依次打印数字 1,2,3,...                      TJ11111111111JT<br>(右图以N为15为例)                            TJ12222222221JT<br>                                                  TJ12333333321JT<br>                                                  TJ12344444321JT<br>                                                  TJ12345554321JT<br>                                                  TJ12345654321JT<br>                                                  TJ12345554321JT<br>                                                  TJ12344444321JT<br>                                                  TJ12333333321JT<br>                                                  TJ12222222221JT<br>                                                  TJ11111111111JT<br>                                                  TJJJJJJJJJJJJJT<br>                                                  TTTTTTTTTTTTTTT</P>
<P>  4. 在N行N列的数阵中, 数K(1〈=K〈=N)在每行和每列中出现且仅<br>  出现一次,这样的数阵叫N阶拉丁方阵。例如下图就是一个五阶拉丁方阵。<br>  编一程序,从键盘输入N值后,打印出所有不同的N阶拉丁方阵,并统计个数。</P>
<P>        1  2  3  4  5<br>        2  3  4  5  1<br>        3  4  5  1  2<br>        4  5  1  2  3<br>        5  1  2  3  4</P>
<P><br>  5. 输入一个十进数,将其转换成 N 进制数(0&lt;N&lt;=16)。<br>  6. 矩阵中填数. 当给出 N*N 的矩阵,要求用程序填入下列形式的数:</P>
<P>   ① 倒填,例如N=5             ② 蛇形填数              ③ 回转填数</P>
<P>┌─┬─┬─┬─┬─┐   ┌─┬─┬─┬─┬─┐   ┌─┬─┬─┬─┬─┐<br>│25│24│23│22│21│   │ 1│ 3│ 4│10│11│   │ 1│16│15│14│13│<br>├─┼─┼─┼─┼─┤   ├─┼─┼─┼─┼─┤   ├─┼─┼─┼─┼─┤<br>│20│19│18│17│16│   │ 2│ 5│ 9│12│19│   │ 2│17│24│23│12│<br>├─┼─┼─┼─┼─┤   ├─┼─┼─┼─┼─┤   ├─┼─┼─┼─┼─┤<br>│15│14│13│12│11│   │ 6│ 8│13│18│20│   │ 3│18│25│22│11│<br>├─┼─┼─┼─┼─┤   ├─┼─┼─┼─┼─┤   ├─┼─┼─┼─┼─┤<br>│10│ 9│ 8│ 7│ 6│   │ 7│14│17│21│24│   │ 4│19│20│21│10│<br>├─┼─┼─┼─┼─┤   ├─┼─┼─┼─┼─┤   ├─┼─┼─┼─┼─┤<br>│ 5│ 4│ 3│ 2│ 1│   │15│16│22│23│25│   │ 5│ 6│ 7│ 8│ 9│<br>└─┴─┴─┴─┴─┘   └─┴─┴─┴─┴─┘   └─┴─┴─┴─┴─┘</P>
<P><br>  7. 读入一行文本,包含若干个单词(以空格间隔,%结尾)。将其中以 A 开头的<br>  单词与以 N 结尾的单词,用头尾交换的办法予以置换。</P>
<P>  8. 输入两个正整数X,Y,将X,Y化为二进制数,然后将这两个二进制数作二进<br>  制加法运算,再将结果化为十进制数输出。</P>
<P>  9. 四人玩火柴棍游戏,每一次都是三个人赢,一个人输。输的人要按赢者手中的火柴<br>  数进行赔偿,即赢者手中有多少根火柴棍,输者就赔偿多少根。现知道玩过四次后,<br>  每人恰好输过一次, 而且每人手中都正好有16根火柴。问此四人做游戏前手中各有<br>  多少根火柴? 编程解决此问题。</P>
<P>10. 如图1所示,编写程序计算                ┎┰┰┰┰┰┰┰┰┰┒<br>    大大小小正方形共有多少?当最小          ┠╂╂╂╂╂╂╂╂╂┨<br>    正方行边长为1时,它们的总面积          ┠╂╂╂╂╂╂╂╂╂┨<br>    共为多少?                              ┠╂╂╂╂╂╂╂╂╂┨<br>                                            ┠╂╂╂╂╂╂╂╂╂┨<br>                                            ┠╂╂╂╂╂╂╂╂╂┨<br>                                            ┠╂╂╂╂╂╂╂╂╂┨<br>                                            ┠╂╂╂╂╂╂╂╂╂┨<br>                                            ┠╂╂╂╂╂╂╂╂╂┨<br>                                            ┠╂╂╂╂╂╂╂╂╂┨<br>                                            ┖┸┸┸┸┸┸┸┸┸┚<br>  11. 巧排数字。将1、2、...、20这20个数排成一排,使得相邻的两个数之<br>  和为一个素数,且首尾两数字之和也为一个素数。编程打印出所有的排法。</P>
<P>12. 下图是一个集装箱仓库,阴影部分表示有集装箱存放不能通过,无阴影处为临时通<br>道。当有人要从入口处到达出口处时,必须寻找可通过路线,请你找出可完成这个过程<br>的最方便(即用最短路线)到达出口处的路径。</P>
<P>          ┎┰┰┰入口┰┰┰┰┰┰┰┰┰┰┰┰┰┰┰┰┰┰┰┰┰┰┰┰┒<br>          ┠╂╂╂──╂╂╂╂┸┸╂┸┸╂┸┸╂┸┸╂╂╂╂┸┸╂╂╂┨<br>          ┠╂╂╂──╂┸┸╂──╂┰┰╂┰┰╂──╂╂╂╂──╂╂╂┨<br>          ┠╂╂╂──╂┰┰╂┰┰╂╂╂╂╂╂╂──╂┸┸╂──╂╂╂┨<br>          ┠╂╂╂──╂╂╂╂╂╂╂╂╂╂╂╂╂┰┰╂┰┰╂┰┰╂╂╂┨<br>          ┠╂╂╂──╂┸┸╂┸┸╂┸┸╂┸┸╂┸┸╂┸┸╂┸┸╂╂╂┨<br>          ┠╂╂╂──╂┰┰╂┰┰╂┰┰╂──╂┰┰╂──╂┰┰╂╂╂┨<br>          ┠╂╂╂──╂╂╂╂╂╂╂╂╂╂──╂╂╂╂──╂╂╂╂╂╂┨<br>          ┠╂╂╂──╂╂╂╂┸┸╂┸┸╂──╂╂╂╂──╂┸┸╂╂╂┨<br>          ┠╂╂╂──╂╂╂╂┰┰╂┰┰╂┰┰╂╂╂╂┰┰╂──╂╂╂┨<br>          ┖┸┸┸──┸┸┸┸┸┸┸┸┸┸┸┸┸┸┸┸┸┸┸出口┸┸┸┚</P>
<P><br>13. 有N个硬币(N为偶数)正面朝上排成一排,每次将 N-1 个硬币翻过来放在原位<br>置, 不断地重复上述过程,直到最后全部硬币翻成反面朝上为止。编程让计算机把<br>翻币的最简过程及翻币次数打印出来(用*代表正面,O 代表反面)。</P>
<P>14. 有黑白棋子各有N个(分别用*和O代替),按下图方式排列</P>
<P>        ***...***OOO...OOO</P>
<P>            N个黑棋            N个白棋</P>
<P>允许将相邻两个棋子互换位置,最后使队形成黑白交替排列,试编程实现该操作。</P>
<P>15. 已知6个城市,用c[i,j]表示从i城市到城市j是否有单向的直达汽车</P>
<P>(1=&lt;i〈=6,1〈=j〈=6), c[i,j]=1 表示城市i到城市j有单向直达汽<br>车; 否则 c[i,j]=0.  试编制程序,对于给出的城市代号i,打印出从该城市出<br>发乘车(包括转车)可以到达的所有城市。<br>16. 设有8枚硬币a,b,c,d,e,f,g,h,其中有一枚硬币是伪造的。<br>真伪硬币的区别仅是重量不同,可能重,可能轻。今要求以天平为工具,用最少的<br>比较次数挑出伪造硬币,并鉴定它是重还是轻。</P>
<P>17. 编写一个程序,当输入不超过60个字符组成的英文文字时,计算机将这个句子<br>中的字母按英文字典字母顺序重新排列,排列后的单词的长度要与原始句子中的长度<br>相同。例如:</P>
<P>    输入:</P>
<P>    THE PRICE OFBREAD IS ¥1 25 PER POUND</P>
<P>    输出:</P>
<P>    ABC DDEEE EFHIINO OP ¥1 25 PPR RRSTU</P>
<P>并且要求只对A到Z的字母重新排列,其它字符保持原来的状态。</P>
<P>18. 在一线性七个格位置的图上有两种不同颜色的棋子A,B. 排列如下图所示,中间<br>格的位置为空。</P>
<P>          ┎─┰─┰─┰─┰─┰─┰─┒<br>          ┃A┃A┃A┃  ┃B┃B┃B┃<br>          ┖─┸─┸─┸─┸─┸─┸─┚</P>
<P>要求将A,B的现行位置交换,形成下图中的排列:</P>
<P>          ┎─┰─┰─┰─┰─┰─┰─┒<br>          ┃B┃B┃B┃  ┃A┃A┃A┃<br>          ┖─┸─┸─┸─┸─┸─┸─┚</P>
<P>移动棋子的条件:</P>
<P>   (1) 每个格中只准放一个棋子。<br>   (2) 任意一个棋子均可移动一格放入空格内。<br>   (3) 一方的棋子均可跳过另一方的一个棋子进入空格。<br>   (4) 任何棋子不得跳跃两个或两个以上棋子(无论颜色同异)<br>   (5) 任何一个颜色棋子只能向前跳,不准向后跳。</P>
<P>编程完成有关的移动,并且完成具有2N+1个格子的情形. 其中两种颜色各有<br>N个棋子,且中间为空格.</P>
<P>19. (背包问题) 有 N 件物品 d1,......dN,每件物品重量为 W1,..., WN<br>(Wi &gt; 0), 每件物品价值为 V1,......VN (Vi&gt;0)。用这N件物品的某个子集<br>填空背包,使得所取物品的总重量&lt;=TOTAL,并设法使得背包中物品的价值尽可<br>能高。</P>
<P>20. (N皇后) 在国际象棋的棋盘上放置N个皇后,使其不能互相攻击,即任意<br>两个皇后不能处在棋盘的同一行,同一列,同一斜线上,试问共有多少种摆法?<br>21. 请设计一个程序,由计算机把1.. ̄.8的八个自然数填入图中,使得横、<br>竖、对角任何两个相邻的小方格中的两个数是不连续的。(下图右侧的 4 个图<br>为禁止的情形).</P>
<P>            ┌─┐          ┌─┐               ┌─┐<br>            │  │          │4│               │8│<br>        ┌─┼─┼─┐      └─┼─┐       ┌─┼─┘<br>        │  │  │  │          │5│       │7│<br>        ├─┼─┼─┤          └─┘       └─┘<br>        │  │  │  │      ┌─┐<br>        └─┼─┼─┘      │6│           ┌─┬─┐<br>            │  │          ├─┤           │1│2│<br>            └─┘          │7│           └─┴─┘<br>                            └─┘</P>
<P>[/quote]</P><br>
[align=right][color=#000066][此贴子已经被作者于2007-6-16 16:32:25编辑过][/color][/align]

野比 发表于 2007-6-16 12:03

<P>将百年兄对第2题的解答搬到这里来<BR>[quote]2. A、B、C、D、E五名学生有可能参加计算机竞赛,根据下列条件判断哪些<BR>  人参加了竞赛:</P>
<P>   (1)A参加时,B也参加;</P>
<P>   (2)B和C只有一个人参加;</P>
<P>   (3)C和D或者都参加,或者都不参加;</P>
<P>   (4)D和E中至少有一个人参加;</P>
<P>   (5)如果E参加,那么A和D也都参加。</P>
<P>___________________________________________________________________</P>
<P>答案:</P>
<P>#include&lt;stdio.h&gt;<BR>int main()<BR>{<BR>char name[]={'A','B','C','D','E'};<BR>int i,value[5];</P>
<P>for(value[0]=0;value[0]&lt;2;value[0]++)<BR>  for(value[1]=0;value[1]&lt;2;value[1]++)<BR>   for(value[2]=0;value[2]&lt;2;value[2]++)<BR>    for(value[3]=0;value[3]&lt;2;value[3]++)<BR>     for(value[4]=0;value[4]&lt;2;value[4]++)<BR>     {<BR>      if((value[1]&gt;=value[0])<BR>          &amp;&amp;(value[1]+value[2]==1)<BR>          &amp;&amp;value[2]==value[3]<BR>          &amp;&amp;(value[3]+value[4])<BR>          &amp;&amp;(!value[4]||(value[4]&amp;&amp;value[0]&amp;&amp;value[3])))<BR>           for(i=0;i&lt;5;i++)<BR>             if(value[i])<BR>                  printf("%c参加\t",name[i]);<BR>             else<BR>                  printf("%c不参加\t",name[i]);<BR>     }<BR>return 0;    </P>
<P>}</P>
<P>结果:</P>
<P>A不参加 B不参加 C参加   D参加   E不参加  <BR>[/quote]</P>

HCL 发表于 2007-6-16 13:00

<P>#include &lt;iostream&gt;<BR>#include &lt;stack&gt;</P>
<P>using namespace std;</P>
<P>int main()<BR>{<BR>    char digit[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};<BR>    <BR>    cout &lt;&lt;"输入待转换整数: ";<BR>    int number;<BR>    cin  &gt;&gt;number;<BR>    cout &lt;&lt;endl;</P>
<P>    cout &lt;&lt;"转换成多少进制? ";<BR>    int base;<BR>    cin  &gt;&gt;base;<BR>    cout &lt;&lt;endl;</P>
<P>    stack&lt;char&gt; stk;<BR>    char remain;<BR>    while (number!=0)<BR>    {<BR>        remain = digit[number%base];<BR>        stk.push(remain);<BR>        number /= base;        <BR>    }<BR>    <BR>    cout &lt;&lt;"结果: ";<BR>    while(!stk.empty())<BR>    {<BR>        cout &lt;&lt;stk.top();<BR>        stk.pop();<BR>    }<BR>    cout &lt;&lt;endl;<BR>    return 0;<BR>}<BR><BR><BR>第五题的,望指点![em02]</P>

aipb2007 发表于 2007-6-16 13:05

<P>辛苦了,我也冒个泡:<br>N皇后:<br><br>版本1:<br><br>[CODE]<br>//file : queens.h<br>#ifndef QUEENS_H<br>#define QUEENS_H<br>const int max_size = 24;<br>class queens{<br>public:<br>    //constructor<br>    queens(int size);<br>    <br>    //main function<br>    void solution();    //recursive function for backtracking<br>    //times of solutions<br>    static unsigned int times_of_solution;<br>protected:<br>    //member functions<br>    void print() const;                //print the solution<br>    void insert(int col);            //add a queen the posn<br>    void remove(int col);            //delete a queen at row-1<br>    bool isSolved() const;            //return true if all queens at right posn<br>    bool isUnguarded(int col) const;    //return true if the posn is guarded by a queen<br>private:<br>    //data members<br>    int row;<br>    int board_size;                    <br>    bool chessboard[max_size][max_size];<br>};<br>#endif[/CODE]</P>
<P>[CODE]<br>//file : queens.cpp<br>#include "queens.h"<br>#include &lt;iostream&gt;<br>queens::queens(int size){<br>    board_size = size;<br>    row = 0;                            //no queen on chess board<br>    for (int i = 0;i &lt; board_size;++i)<br>        for (int j =0;j &lt; board_size;++j)<br>            chessboard[i][j] = false;<br>}<br>bool queens::isSolved() const{<br>    return row == board_size;<br>}<br>bool queens::isUnguarded(int col) const{<br>    bool isOk = true;<br>    //at current column <br>    for (int i = 0;isOk &amp;&amp; i &lt; row;++i)<br>        isOk = !chessboard[i][col];<br>    //at left upper diagonal<br>    for (int i = 1;isOk &amp;&amp; row-i &gt;= 0 &amp;&amp; col-i &gt;= 0;++i)<br>        isOk = !chessboard[row-i][col-i];<br>    //at right upper diagonal<br>    for (int i = 1;isOk &amp;&amp; row-i &gt;= 0 &amp;&amp; col+i &lt; board_size;++i)<br>        isOk = !chessboard[row-i][col+i];<br>    return isOk;<br>}<br>void queens::insert(int col){<br>    chessboard[row++][col] = true;<br>}<br>void queens::remove(int col){<br>    chessboard[--row][col] = false;<br>}<br>void queens::print() const{<br>    for (int i = 0;i &lt; board_size;++i){<br>        for (int j = 0;j &lt; board_size;++j)<br>            std::cout &lt;&lt; chessboard[i][j] &lt;&lt; " ";<br>        std::cout &lt;&lt; std::endl;<br>    }<br>    ++times_of_solution;<br>    std::cout &lt;&lt; "**************************************" &lt;&lt; std::endl;<br>}<br>void queens::solution(){<br>    if (isSolved())<br>        print();<br>    else<br>        for (int col = 0;col &lt; board_size;++col)<br>            if (isUnguarded(col)){<br>                insert(col);<br>                //for backtracking<br>                solution();<br>                remove(col);<br>            }<br>}[/CODE]</P>
<P><br> </P>
<DIV class=htmlcode>
<P>//file : main.cpp<br>#include "queens.h"<br>#include &lt;iostream&gt;<br>#include &lt;ctime&gt;<br>using namespace std;</P>
<P>unsigned int queens::times_of_solution = 0;<br>int main(){<br>    int size;<br>    cin &gt;&gt; size;<br>    while (size &lt; 1 || size &gt; max_size){<br>        cout &lt;&lt; "the queen must between 1 ------ " &lt;&lt; max_size &lt;&lt; endl;<br>        cin &gt;&gt; size;<br>    }<br>    queens puzzle(size);</P>
<P>    ////////////////////////////////////////////<br>    clock_t start,finish;<br>    start = clock();<br>    ////////////////////////////////////////////</P>
<P>    puzzle.solution();<br>    cout &lt;&lt; "number of solutions ------ " &lt;&lt; queens::times_of_solution &lt;&lt; endl;</P>
<P>    ////////////////////////////////////////////<br>    finish = clock();<br>    double time = (double) (finish - start) / CLOCKS_PER_SEC;<br>    cout &lt;&lt; "time used ------ " &lt;&lt; time &lt;&lt; endl;<br>    ////////////////////////////////////////////<br>}</P></DIV>
[align=right][color=#000066][此贴子已经被作者于2007-6-16 13:12:08编辑过][/color][/align]

aipb2007 发表于 2007-6-16 13:07

<P>版本2 : 无迭代改进版本:<br><br><br>[CODE]<br>//file : queens.h<br>#pragma once<br>const int max_board_size = 24;<br>class queens{<br>public:<br>    //constructor<br>    queens(int size);<br>    <br>    //main function<br>    void solution();    //recursive function for backtracking<br>    //times of solutions<br>    static unsigned int times_of_solution;<br>protected:<br>    //member functions<br>    void print() const;                //print the solution<br>    void insert(int col);            //add a queen the posn<br>    void remove(int col);            //delete a queen at row-1<br>    bool isSolved() const;                //return true if all queens at right posn<br>    bool isUnguarded(int col) const;    //return true if the posn is guarded by a queen<br>private:<br>    //make bool array for the chessboard<br>    bool col_free[max_board_size];<br>    bool upward_free[2*(max_board_size-1)];<br>    bool downward_free[2*(max_board_size-1)];<br>    int queen_in_rows[max_board_size];        //store the column of queens at each row<br>    //data members<br>    int row;<br>    int board_size;                    <br>};[/CODE]<br><br>[CODE]<br>//file : queens.cpp<br>#include "queens.h"<br>#include &lt;iostream&gt;<br>queens::queens(int size){<br>    board_size = size;<br>    row = 0;<br>    //set all columns free<br>    for (int i = 0;i &lt; board_size;++i)<br>        col_free[i] = true;<br>    //set all upward diagonals free<br>    for (int i = 0;i &lt; 2*(board_size-1);++i)<br>        upward_free[i] = true;<br>    //set all downward diagonals free<br>    for (int i = 0;i &lt; 2*(board_size-1);++i)<br>        downward_free[i] = true;<br>}<br>bool queens::isSolved() const{<br>    return row == board_size;<br>}<br>bool queens::isUnguarded(int col) const{<br>    return col_free[col] &amp;&amp; upward_free[row+col]<br>    &amp;&amp; downward_free[row-col+board_size-1];<br>}<br>void queens::insert(int col){<br>    queen_in_rows[row] = col;<br>    //set the column &amp; diagonal which is guarded by queen to false<br>    col_free[col] = false;<br>    upward_free[row+col] = false;<br>    downward_free[row-col+board_size-1] = false;<br>    ++row;<br>}<br>void queens::remove(int col){<br>    //remove a queen at previous row<br>    --row;                        //back to previous row<br>    //set the column &amp; diagonal which is guarded by queen to true<br>    col_free[col] = true;<br>    upward_free[row+col] = true;<br>    downward_free[row-col+board_size-1] = true;<br>}<br>void queens::print() const{<br>    for (int i = 0;i &lt; board_size;++i){<br>        for (int j = 0;j &lt; board_size;++j)<br>            std::cout &lt;&lt; (j == queen_in_rows[i] ? "1 " : "0 ");<br>        std::cout &lt;&lt; std::endl;<br>    }<br>    std::cout &lt;&lt; "---------------------------------" &lt;&lt; std::endl;<br>    ++times_of_solution;<br>}<br>void queens::solution(){<br>    if (isSolved())<br>        print();<br>    else<br>        for (int col = 0;col &lt; board_size;++col)<br>            if (isUnguarded(col)){<br>                insert(col);<br>                //the steps for backtracking<br>                solution();<br>                remove(col);<br>            }<br>}[/CODE]</P>
<P><br></P>
<DIV class=htmlcode>
<P>//file : main.cpp<br>#include "queens.h"<br>#include &lt;iostream&gt;<br>#include &lt;ctime&gt;<br>using namespace std;</P>
<P>unsigned int queens::times_of_solution = 0;<br>int main(){<br>    int size;<br>    cin &gt;&gt; size;<br>    while (size &lt; 4 || size &gt; max_board_size){<br>        cout &lt;&lt; "the queen must between 4 ------ " &lt;&lt; max_board_size &lt;&lt; endl;<br>        cin &gt;&gt; size;<br>    }<br>    queens puzzle(size);</P>
<P>    ////////////////////////////////////////////<br>    clock_t start,finish;<br>    start = clock();<br>    ////////////////////////////////////////////</P>
<P>    puzzle.solution();<br>    cout &lt;&lt; "number of solutions ------ " &lt;&lt; queens::times_of_solution &lt;&lt; endl;</P>
<P>    ////////////////////////////////////////////<br>    finish = clock();<br>    double time = (double) (finish - start) / CLOCKS_PER_SEC;<br>    cout &lt;&lt; "time used ------ " &lt;&lt; time &lt;&lt; endl;<br>    ////////////////////////////////////////////<br>}</P></DIV>
<P><br></P>
[align=right][color=#000066][此贴子已经被作者于2007-6-16 13:10:49编辑过][/color][/align]

野比 发表于 2007-6-16 13:34

仔细研究中

野比 发表于 2007-6-16 13:46

<DIV class=quote><B>以下是引用<U>HCL</U>在2007-6-16 13:00:49的发言:</B><br>
<P>#include &lt;iostream&gt;<br></P>
<P>...第五题的,望指点![em02]</P></DIV>
<P>第五题用堆栈的话就有些限制了吧? 遇到堆栈很小的情况.<br>如果要考虑负数的话就更难了..象2,8,16等进制都是用补码表示的...啊..好难啊...[em11]</P>
[align=right][color=#000066][此贴子已经被作者于2007-6-16 14:27:53编辑过][/color][/align]

百年不亮 发表于 2007-6-16 15:46

<P>第2题分析:</P>
<P>首先要设置逻辑变量。value[i]==1时表示第i(i=0~4依次表示A,B,C,D,E五人)个人参加,为0则不参加。</P>
<P>然后写出逻辑函数。将下面的逻辑关系写成函数形式:<BR>   (1)A参加时,B也参加;value[1]&gt;=value[0]<BR>   (2)B和C只有一个人参加;value[1]+value[2]==1<BR>   (3)C和D或者都参加,或者都不参加;value[2]==value[3]<BR>   (4)D和E中至少有一个人参加;(value[3]+value[4])<BR>   (5)如果E参加,那么A和D也都参加。(!value[4]||(value[4]&amp;&amp;value[0]&amp;&amp;value[3]))<BR>表示为Y=(value[1]&gt;=value[0])&amp;&amp;(value[1]+value[2]==1)&amp;&amp;value[2]==value[3]&amp;&amp;(value[3]+value[4])&amp;&amp;(!value[4]||(value[4]&amp;&amp;value[0]&amp;&amp;value[3])))</P>
<P>最后穷举法把所有的组合算出来,将Y==1时的情况输出。<BR></P>

野比 发表于 2007-6-16 16:03

哦, 谢谢百年兄指点!

xslff 发表于 2007-6-16 17:39

晕,不会C啊,Java编的行不?

xslff 发表于 2007-6-16 17:50

请问一下,你们编C都用的什么编译器啊?方便的话,可以传我一个么?

野比 发表于 2007-6-16 18:02

我用TC++, 至于用Java行不行... 没人规定这个C++练习就必须用C++...(^^!)<br>主要目的是练习编程技巧, 当然要选用自己擅长的语言咯..<br>何况习题里面好多NOI的题, NOI可是PASCAL的天下啊...

xslff 发表于 2007-6-16 18:04

呵呵,那我就献献丑啦!

yuyunliuhen 发表于 2007-6-16 18:04

<P>学JAVA肯定用过EC的了,那个现在可以编译C++程序的啊,加个支持的插件就行了。</P>
[align=right][color=#000066][此贴子已经被作者于2007-6-16 19:29:48编辑过][/color][/align]

ggrrrman66 发表于 2007-6-16 19:30

第4楼的程序我怎么不能 编译<BR>用turbo c 显示有很多错误

野比 发表于 2007-6-16 20:25

<DIV class=quote><B>以下是引用<U>ggrrrman66</U>在2007-6-16 19:30:50的发言:</B><BR>第4楼的程序我怎么不能 编译<BR>用turbo c 显示有很多错误</DIV>
<P>第4楼的程序可以运行... VC++ .NET 2005下编译OK<BR>关键是...那个是C++写的, 老大, 拿TC当然有错了.<BR>你可以用TC++3.0编译看看</P>

游乐园 发表于 2007-6-17 09:20

<P>很久没来了,现在C++板块弄的蛮不错的...大家继续加油.    路过顺便挑个简单的做做   呵呵 <BR><BR><FONT color=#ff0000>-----------------------------------------------------------------------------------------------------</FONT><BR>17. 编写一个程序,当输入不超过60个字符组成的英文文字时,计算机将这个句子<BR>中的字母按英文字典字母顺序重新排列,排列后的单词的长度要与原始句子中的长度<BR>相同。例如:</P>
<P>    输入:</P>
<P>    THE PRICE OFBREAD IS ¥1 25 PER POUND</P>
<P>    输出:</P>
<P>    ABC DDEEE EFHIINO OP ¥1 25 PPR RRSTU</P>
<P>并且要求只对A到Z的字母重新排列,其它字符保持原来的状态。<BR><BR><BR>[code]<BR>#include&lt;iostream&gt;<BR>#include&lt;string&gt;<BR>#include&lt;cctype&gt;<BR>#include&lt;algorithm&gt;<BR>using namespace std;</P>
<P>int main()<BR>{<BR> string str,s;<BR> int num[60]={0};<BR> int j=1;<BR> getline(cin,str);<BR> for(int i=0; i&lt;str.size(); i++) //把字母字符存到s中<BR> {<BR>  if(isalpha(str[i])) s+=str[i];<BR>  else <BR>  {<BR>   num[j++]=i; //记录非字母字符的位置<BR>      num[0]++; //记录非字母字符的个数<BR>  }<BR> }</P>
<P> sort(s.begin(),s.end()); //排序A~Z或a~z</P>
<P>    if(s.size()!=str.size())<BR>  for(j=1; j&lt;=num[0]; ++j) <BR>   s.insert(num[j],str.substr(num[j],1)); //调整字符串</P>
<P> cout&lt;&lt;endl&lt;&lt;s&lt;&lt;endl;</P>
<P> return 0;<BR>}<BR>[/code]</P>

aipb2007 发表于 2007-6-17 09:52

<DIV class=quote><B>以下是引用<U>游乐园</U>在2007-6-17 9:20:18的发言:</B><BR>
<P>很久没来了,现在C++板块弄的蛮不错的...大家继续加油.    路过顺便挑个简单的做做   呵呵 <BR><BR><FONT color=#ff0000>-------------------------------------------------------------------------------------------------</FONT></P></DIV>
<P>游乐园大哥,很久不来在做什么?呵呵~难得看到你啊!多来耍哈嘛![em02]</P>

aipb2007 发表于 2007-6-17 10:20

<DIV class=htmlcode>#include &lt;iostream&gt;<br>#include &lt;string&gt;<br>#include &lt;algorithm&gt;<br>using namespace std;<br><br>int main(){<br>    string input = "",letters = "";<br>    char ch;<br>    <br>    while ((ch = getchar()) != '\n'){<br>        if(isalpha(ch))<br>            letters += ch;<br>        input += ch;<br>    }<br>    sort(letters.begin(),letters.end());<br>    <br>    for (int i = 0,j = 0;i &lt; input.size();++i){<br>        if (!isalpha(input[i]))<br>            cout &lt;&lt; input[i];<br>        else<br>            cout &lt;&lt; letters[j++];<br>    }<br>    system("pause");<br>}</DIV>也是17题!<br>嘿嘿[em01]
[align=right][color=#000066][此贴子已经被作者于2007-6-17 10:38:17编辑过][/color][/align]


页: [1] 2 3 4 5 6 7 8 9 10

编程论坛