华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1333|回复: 2
打印 上一主题 下一主题

数字游戏训练题

[复制链接]

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
跳转到指定楼层
楼主
发表于 2019-3-31 11:14:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
典型例题:
1、1-9九个数字拼成三个三位数,让他们保持1:2:3的关系
2、1-9九个数字分成三个三位数,每个都是完全平方数
3、ONE+ONE=TWO,每个字母表示一个数字不同的字母表示不同的数字
4、ahhaah/joke=ha其中每个字母表示一个数字,不同的字母表示不同的数字,求每个字母的值
回复

使用道具 举报

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
沙发
 楼主| 发表于 2019-3-31 19:37:58 | 只看该作者
这些题目的做法都是类似的,枚举每个字母的取值,判断是否满足条件。条件有明显条件和隐藏条件两种:
明显的条件比如第一题中的1:2:3的关系,第三题中的one+one=two,o不能为0等。
隐藏条件是每个字母表示的数字不能重复,判断重复一般都用数组,一般做法是定义a0-a9,初值都是1,每出现一次某个数字,它所对应的ai就减一,最后检查a0-a9,谁的值小于0说明出现了1次以上。或者某个ai值还是1,说明i没有出现过。
代码如下:
  1. for (i=0; i<=9; i++) a[i]=1;
  2. 对应的a[x]--;
  3. b=1;
  4. for (i=0; i<=9; i++) if (a[i]<0) b=0;
  5. if (b)  输出
复制代码

回复 支持 反对

使用道具 举报

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
板凳
 楼主| 发表于 2019-3-31 19:41:59 | 只看该作者
1-9九个数字分成三个三位数,每个都是完全平方数

  1. #include<iostream>
  2. using namespace std;
  3. int a[10];
  4. int x1,x2,x3,xx1,xx2,xx3;  ///枚举的数字和完全平方数
  5. bool b;
  6. int i,k,s=0;
  7. int main()
  8. {
  9.     for (x1=10; x1*x1<=999; x1++)
  10.         for (x2=x1+1; x2*x2<=999; x2++)
  11.             for (x3=x2+1; x3*x3<=999; x3++)  /// 三重枚举
  12.             {
  13.                 xx1=x1*x1,xx2=x2*x2,xx3=x3*x3;  ///生成完全平方数
  14.                 for (i=1;i<=9;i++) a[i]=1;  ///初始都为1,注意这句话的位置
  15.                 k=xx1/100%10;a[k]--;
  16.                 k=xx1/10%10;a[k]--;
  17.                 k=xx1/1%10;a[k]--;
  18.                 k=xx2/100%10;a[k]--;
  19.                 k=xx2/10%10;a[k]--;
  20.                 k=xx2/1%10;a[k]--;
  21.                 k=xx3/100%10;a[k]--;
  22.                 k=xx3/10%10;a[k]--;
  23.                 k=xx3/1%10;a[k]--; ///对应-1
  24.                
  25.                 b=1;for (i=1;i<=9;i++) if (a[i]!=0) b=0;  ///判断1-9九个数字是否有人没有被用过
  26.                 if (b) cout<<xx1<<' '<<xx2<<' '<<xx3<<endl;
  27.           }

  28.     return 0;
  29. }
复制代码


其中有一段,每个数字对应的ai-1,我这里用了很直观的繁琐的方法。当然也可以把这三个数字拼成一个9位数,用循环去做。
  1. int x=xx1*1000000+xx2*1000+xx3;
  2. while (x>0)
  3.       {
  4.            k=x%10; a[k]--;
  5.            x=x/10;
  6.       }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-11-2 10:29 , Processed in 0.095718 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表