华师一附中OI组
标题:
数字游戏训练题
[打印本页]
作者:
admin
时间:
2019-3-31 11:14
标题:
数字游戏训练题
典型例题:
1、1-9九个数字拼成三个三位数,让他们保持1:2:3的关系
2、1-9九个数字分成三个三位数,每个都是完全平方数
3、ONE+ONE=TWO,每个字母表示一个数字不同的字母表示不同的数字
4、ahhaah/joke=ha其中每个字母表示一个数字,不同的字母表示不同的数字,求每个字母的值
作者:
admin
时间:
2019-3-31 19:37
这些题目的做法都是类似的,枚举每个字母的取值,判断是否满足条件。条件有明显条件和隐藏条件两种:
明显的条件比如第一题中的1:2:3的关系,第三题中的one+one=two,o不能为0等。
隐藏条件是每个字母表示的数字不能重复,判断重复一般都用数组,一般做法是定义a0-a9,初值都是1,每出现一次某个数字,它所对应的ai就减一,最后检查a0-a9,谁的值小于0说明出现了1次以上。或者某个ai值还是1,说明i没有出现过。
代码如下:
for (i=0; i<=9; i++) a[i]=1;
对应的a[x]--;
b=1;
for (i=0; i<=9; i++) if (a[i]<0) b=0;
if (b) 输出
复制代码
作者:
admin
时间:
2019-3-31 19:41
1-9九个数字分成三个三位数,每个都是完全平方数
#include<iostream>
using namespace std;
int a[10];
int x1,x2,x3,xx1,xx2,xx3; ///枚举的数字和完全平方数
bool b;
int i,k,s=0;
int main()
{
for (x1=10; x1*x1<=999; x1++)
for (x2=x1+1; x2*x2<=999; x2++)
for (x3=x2+1; x3*x3<=999; x3++) /// 三重枚举
{
xx1=x1*x1,xx2=x2*x2,xx3=x3*x3; ///生成完全平方数
for (i=1;i<=9;i++) a[i]=1; ///初始都为1,注意这句话的位置
k=xx1/100%10;a[k]--;
k=xx1/10%10;a[k]--;
k=xx1/1%10;a[k]--;
k=xx2/100%10;a[k]--;
k=xx2/10%10;a[k]--;
k=xx2/1%10;a[k]--;
k=xx3/100%10;a[k]--;
k=xx3/10%10;a[k]--;
k=xx3/1%10;a[k]--; ///对应-1
b=1;for (i=1;i<=9;i++) if (a[i]!=0) b=0; ///判断1-9九个数字是否有人没有被用过
if (b) cout<<xx1<<' '<<xx2<<' '<<xx3<<endl;
}
return 0;
}
复制代码
其中有一段,每个数字对应的ai-1,我这里用了很直观的繁琐的方法。当然也可以把这三个数字拼成一个9位数,用循环去做。
int x=xx1*1000000+xx2*1000+xx3;
while (x>0)
{
k=x%10; a[k]--;
x=x/10;
}
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2