蓝桥杯 2016c/c++A组 题解

论坛 期权论坛     
匿名小用户   2019-10-20 18:49   118   0
<h1>非官方题解,个人题解。个人能力有限,如果描述和结果有问题,请留言<br></h1>
<h1>填空题</h1>
<h2>第一题</h2>
<p><br>
网友年龄<br><br>
某君新认识一网友。<br>
当问及年龄时,他的网友说:<br>
“我的年龄是个2位数,我比儿子大27岁,<br>
如果把我的年龄的两位数字交换位置,刚好就是我儿子的年龄”<br><br>
请你计算:网友的年龄一共有多少种可能情况?<br><br>
提示:30岁就是其中一种可能哦.<br><br>
请填写表示可能情况的种数。<br>
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。</p>
<p><br></p>
<p>思路:拆分十位与个位,反转以后构造儿子的年龄,使用原数减儿子的年龄判断即可</p>
<p></p>
<pre class="blockcode"><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;
int main()
{
    int ans=0;
    for(int i=30;i&lt;100;i++)
    {
        int si=i/10;
        int ge=i%10;
        if(i-(ge*10+si)==27)
            ans++;
    }
    cout&lt;&lt;ans;
    return 0;
}
</code></pre><br>
我的答案是7种.分别是如下情况
<p></p>
<p>30 3<br>
41 14<br>
52 25<br>
63 36<br>
74 47<br>
85 58<br>
96 69</p>
<p><br></p>
<p><br></p>
<h2>第二题</h2>
<p><br></p>
<p><br>
生日蜡烛<br><br>
某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛。<br><br>
现在算起来,他一共吹熄了236根蜡烛。<br><br>
请问,他从多少岁开始过生日party的?<br><br>
请填写他开始过生日party的年龄数。<br>
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。</p>
<p><br></p>
<p>题目的意思很明了,求那一岁开始生日</p>
<p>思路:直接枚举开始过生日的那一岁即可</p>
<p><br></p>
<p></p>
<pre class="blockcode"><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

int main()
{
    for(int i=1;i&lt;100;i++)
    {
        int sum=0;
        for(int j=i;j&lt;100;j++)
        {
            sum+=j;
            if(sum&gt;236)
                break;
            if(sum==236)
                cout&lt;&lt;i&lt;&lt;"-&gt;"&lt;&lt;j&lt;&lt;endl;
        }

    }
    return 0;
}
</code></pre><br>
结果是26-&gt;33,也就是说从26岁开始过生日,直到现在33岁。
<p></p>
<p>有人说这个题出得不严谨,说假如那个人就是236岁过的生日欸?人还是人,还是没有活的那么长的,趁着自己还年轻少一点浮躁,多干点实事(对我自己说的)</p>
<h2>第三题</h2>
<p><br>
方格填数<br><br>
如下的10个格子<br>
+--+--+--+<br>
| | | |<br>
+--+--+--+--+<br>
| | | | |<br>
+--+--+--+--+<br>
| | | |<br>
+--+--+--+<br><br>
(如果显示有问题,也可以参看【图1.jpg】)<br><img alt="" src="https://201907.oss-cn-shanghai.aliyuncs.com/cs/5606289-89b4ab613e3f82f8eb25e04741771758"><br>
填入0~9的数字。要求:连续的两个数字不能相邻。<br>
(左右、上下、对角都算相邻)<br><br>
一共有多少种可能的填数方案?<br><br>
请填写表示方案数目的整数。<br>
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。</p>
<p>思路:搜索,把10个空全部填完,然后判断每一个数字是否符合要求。</p>
<p>代码不是我自己写的,参考<a data-token="e3e17736212722c3ab8c83c37b5f3942" href="http://blog.csdn.net/y1196645376/article/details/50938608" rel="nofollow">Wahh_1314</a><br></p>
<p></p>
<pre class="blockcode"><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;cmath&gt;
using namespace std;

const int row=3,col=4;

int visit[10];
int flag[row][col];
int mpt[row][col];
int ans=0;

void init()
{
    ans=0;
    for(int i=0;i&lt;10;i++)
        visit[i]=0;
    for(int i=0;i&lt;row;i++)
        for(int j=0;j&lt;col;j++)
        {
            mpt[i][j]=0;
            flag[i][j]=1;
        }
    //左上角和右下角不能填写任何的数字
    flag[0][0]=0;
    flag[2][3]=0;
}

void judge()
{
    //八个方向 右 左 上 下 右下 左下 右上 左上
    int dir[8][2] = { 0,1,  0,-1,  1,0,  -1,0,  1,1,  1,-1,  -1,1,  -1,-1};
    int valid=1;//初始化为合法
    for(int i=0;i&lt;3;i++)
    {
        for(int j=0;j&lt;4;j++)
        {
            //左上角和右下角不处理
            if(flag[i][j]==0) continue;
            for(int k=0;k&lt;8;k++)
            {
                 int x,y;
                 x = i + dir[k][0];
                 y = j + dir[k][1];
                 //当前访问点是否还在矩形中
                if(x &lt; 0 || x &gt;= 3 || y &lt; 0 || y &gt;= 4 || flag[x][y] == 0) continue;
                //相邻即相减后的绝对值为1 判断当前是否合法
                if(abs(mpt[i][j]-mpt[x][y]==1))valid=0;
            }
        }
    }
    if(valid){
        ans++;
        //用来测试输出结果
        for(int i=0;i&lt;row;i++){
            for(int j=0;j&lt;col;j++)
                cout&lt;&lt;mpt[i][j];
            cout&lt;&lt;endl;
        }
        cout&lt;&lt;endl;
    }
}


void dfs(int n)
{
    int x=n/4;//获得所在行
    int y=n%4;//获得所在列

    if(x==3)//填满后判断是否满足情况
    {
        judge();
        return;
    }
    if(flag[x][y])//
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:50
帖子:1079
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP