2016蓝桥杯省赛软件A组-寒假作业

时间:2022-09-10 13:52:43

一.题目描述

现在小学的数学题目也不是那么好玩的。
看看这个寒假作业:


   □ + □ = □
   □ - □ = □
   □ × □ = □
   □ ÷ □ = □


   (如果显示不出来,可以参见【图1.jpg】)

2016蓝桥杯省赛软件A组-寒假作业
   
每个方块代表1~13中的某一个数字,但不能重复。
比如:
 6  + 7 = 13
 9  - 8 = 1
 3  * 4 = 12
 10 / 2 = 5


以及: 
 7  + 6 = 13
 9  - 8 = 1
 3  * 4 = 12
 10 / 2 = 5


就算两种解法。(加法,乘法交换律后算不同的方案)
 
你一共找到了多少种方案?




请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。


二.这道题目我相信16年蓝桥杯省赛现场我还是没有做出来,能想象的到当时是在不加限制条件的情况下暴力求解,结果一直运行不出来。

其实这道题目的话有很多限制条件,题目很简单,这些限制条件可以想得到。

1.首先除的情况是最少的:12/6=2,12/3=4,12/4=3,12/6=2,10/5=2,10/2=5,8/4=2,8/2=4,6/3=2,6/2=3

2.对于乘法来说,乘数不能为1,7,8,9,10,11,12,13,不能等于1是因为这样会出现重复的数,不能等于后面的是因为结果一定会大于13

3.对于加法来说,每个加数不能为13,否则结果会大于13

4.对于减法来说,减数要比被减数要小

5.每个数都不相等


三.解题思路

首先固定做除运算的三个数,然后在暴力其他的数,共有64种


四.代码

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,count,t;
while(cin>>a0>>a1>>a2)
{
count=0;
for(a3=2;a3<=6;a3++)
{
if(a3!=a0&&a3!=a1&&a3!=a2)
{
for(a4=2;a4<=6;a4++)
{
if(a4!=a0&&a4!=a1&&a4!=a2&&a4!=a3&&(a3*a4<13)&&(a3*a4!=a0)&&(a3*a4!=a1)&&(a3*a4!=a2)&&(a3*a4!=a3)&&(a3*a4!=a4))
{
a5=a3*a4;
for(a6=1;a6<13;a6++)
{
if(a6!=a0&&a6!=a1&&a6!=a2&&a6!=a3&&a6!=a4&&a6!=a5)
{
for(a7=1;a7<13;a7++)
{
if(a7!=a0&&a7!=a1&&a7!=a2&&a7!=a3&&a7!=a4&&a7!=a5&&a7!=a6)
{
if((a6+a7<=13)&&(a6+a7!=a0)&&(a6+a7!=a1)&&(a6+a7!=a2)&&(a6+a7!=a3)&&(a6+a7!=a4)&&(a6+a7!=a5)&&(a6+a7!=a6)&&(a6+a7!=a7))
{
a8=a6+a7;
for(a9=1;a9<=13;a9++)
{
if(a9!=a0&&a9!=a1&&a9!=a2&&a9!=a3&&a9!=a4&&a9!=a5&&a9!=a6&&a9!=a7&&a9!=a8)
{
for(a10=1;a10<=13;a10++)
{
if(a10<a9&&a10!=a0&&a10!=a1&&a10!=a2&&a10!=a3&&a10!=a4&&a10!=a5&&a10!=a6&&a10!=a7&&a10!=a8&&a10!=a9)
{
t=a9-a10;
if(t!=a0&&t!=a1&&t!=a2&&t!=a3&&t!=a4&&t!=a5&&t!=a6&&t!=a7&&t!=a8&&t!=a9&&t!=a10)
{
a11=t;
count++;
printf("%d/%d=%d\n",a0,a1,a2);
printf("%d*%d=%d\n",a3,a4,a5);
printf("%d+%d=%d\n",a6,a7,a8);
printf("%d-%d=%d\n",a9,a10,a11);
}
}
}
}
}
}
}
}
}
}}
}
}
}
cout<<count<<endl;
}
return 0;
}