2012年蓝桥杯【初赛试题】奇怪的比赛-阿里云开发者社区

开发者社区> 人工智能> 正文
登录阅读全文

2012年蓝桥杯【初赛试题】奇怪的比赛

简介:

题目描述:

    某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:

    每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。

    每位选手都有一个起步的分数为10分。

    某获胜选手最终得分刚好是100分,如果不让你看比赛过程,你能推断出他(她)哪个题目答对了,哪个题目答错了吗?

    如果把答对的记为1,答错的记为0,则10个题目的回答情况可以用仅含有1和0的串来表示。例如:0010110011 就是可能的情况。

    你的任务是算出所有可能情况。每个答案占一行。

    答案写在“解答.txt”中,不要写在这里!


思路:我觉得这一题适合用深入搜索递归来做,每一题只有两种情况,对与错,对了,当前成绩就翻倍,错了,当前成绩就减去此题的题号,然后接着向下一个题进行递归(继续两种情况并且继续递归,直到到第10题回答完结束)。判定结束条件是,答完第10题后,成绩刚好为100分的时候,输出10题的对错情况然后结束本次递归,成绩不为100分直接结束本次递归。

那么,怎么输出题目的对错呢,我用的是一个结构体,有一个判定元素flag来判定此题是否对。(后来想想直接用数组存0和1也是可以的,不过结构体在其他类型的判定上也是很有用的)。

正确答案:

1011010000
0111010000
0010110011

AC代码:

#include<stdio.h>
#include<stdlib.h>
struct node
{
  int flag; 
}a[20];
void Test(int n,int m)
{
    int i,j;
    if(n==10)
    {
        if(m==100)
        {
            for(i=1;i<=10;i++)
            printf("%d",a[i].flag);
            puts("");
            return;
        }
        else
        return;
    }
    i=n+1;
    m*=2;a[i].flag=1;
    Test(i,m);
    m/=2;
    m-=i;a[i].flag=0;
    Test(i,m);
    m+=i;
}
int main()
{
    int i,j,n,m=10;
    Test(0,10);
    system("pause");
    return 0;
}


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
人工智能
使用钉钉扫一扫加入圈子
+ 订阅

了解行业+人工智能最先进的技术和实践,参与行业+人工智能实践项目

其他文章