题解:猜数字——穷举法的应用

【题目】在下面的加法算式中,不同的符号代表不同的数字,相同的符号代表相同的数字。请设计程序求出"都、要、学、C"4个符号分别代表的数字。

          学  C
      要  学  C
+ 都  要  学  C
________________
  2   0   0   8

【本讲结构】

(一)讲解视频

(二)相关习题

(三)视频中的代码

(四)其他写法的代码

(五)部分相关习题的参考例程

【正文】

(一)讲解视频(点下面的图标,视频中有个口误,“枚举”应该为“穷举”。)

(二)相关习题

1. (编程题)下列乘法算式中:每个汉字代表1个数字(1~9)。相同的汉字代表相同的数字,不同的汉字代表不同的数字。试编程确定使得整个算式成立的数字组合,如有多种情况,请给出所有可能的答案。

       赛软件
     ×   比赛
   ----------
   =  软件比拼

(*)2. 两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三对赛手的名单。(提示:此题貌似与猜数字无关,但有相同的思路。无非是a有可能与x,y,z中的任一个打,b、c也是这样。构造循环,穷举之。)

3. 有等式[※×(※3+※)]2=8※※9,其中※处为1个数字,滴上了墨水无法辨认。请编程找出※表示哪个数字。

4. 在下列加法的算式中,A、B、C、D、E、F、G、H、M、N分别表示0-9的不同数字,且A、D、M不为0,编程求出这些数字并且输出这些数字组成的算术计算竖式。

     A  B  C  D  E
           D  F  G
+          D  F  G
--------------------

     M  N  H  D  E    

  (提示:此题用穷举的办法自然可以,但7重循环加上各种判断,太繁杂了。参考《狂人C——程序员入门必备》P348,用回溯法解决。开始学一些算法策略应该的。

(三)视频中的代码

未优化前的代码

#include <iostream>
using namespace std;
int main()
{
	int dou,yao,xue,c,s;//变量这样取,比有些题解上用i,j,p,q之类的要清晰得多
	for(dou=1;dou<3;dou++)
		for(yao=0;yao<10;yao++)
			for(xue=0;xue<10;xue++)
				for(c=0;c<10;c++)
					if((dou-yao)*(dou-xue)*(dou-c)*(yao-xue)*(yao-c)*(xue-c)!=0)//一个技巧:表示两两不同可以这样做
					{
						s=4*c+3*xue*10+2*yao*100+dou*1000;
						if(2008==s)
							cout<<dou<<yao<<xue<<c<<endl;
					}
		return 0;
}  

最终的求解程序

#include <iostream>
using namespace std;
int main()
{
	int dou,yao,xue,c,s;
	for(dou=1;dou<3;dou++)
		for(yao=0;yao<10;yao++)
		{
			if(dou==yao) continue;//“都”和“要”的取值如果相同了,将不再考虑另外两字的取值,效果可观
			for(xue=0;xue<10;xue++)
			{
				if(xue==yao||xue==dou) continue;  //理由同上
				for(c=0;c<10;c++)
					if((dou-c)*(yao-c)*(xue-c)!=0)
					{
						s=4*c+3*xue*10+2*yao*100+dou*1000;
						if(2008==s)
							cout<<dou<<yao<<xue<<c<<endl;
					}
			}
		}
		return 0;
}  

(五)部分相关习题的参考例程

(*)2. 两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三对赛手的名单。(提示:此题貌似与猜数字无关,但有相同的思路。无非是a有可能与x,y,z中的任一个打,b、c也是这样。构造循环,穷举之。)

#include <iostream>
using namespace std;
int main()
{
	char a_pk,b_pk,c_pk;   //a_pk是a的对手,b_pk是b的对手,c_pk是c的对手
	for(a_pk='x';a_pk<='z';a_pk++)
		for(b_pk='x';b_pk<='z';b_pk++)
		{
			if(a_pk!=b_pk)
				for(c_pk='x';c_pk<='z';c_pk++)
				{
					if(a_pk!=c_pk&&b_pk!=c_pk)
					{
						if(a_pk!='x'&&c_pk!='x'&&c_pk!='z')
							printf("order is a--%c\tb--%c\tc--%c\n",a_pk,b_pk,c_pk);
					}
				}
		}
		return 0;
}  
时间: 2024-08-30 06:37:21

题解:猜数字——穷举法的应用的相关文章

算法系列(十六) 使用穷举法解猜结果游戏

一. 引言 穷举是解决问题的一种常用思路,当对一个问题无从下手的时候,可以考虑在问题 域允许的范围内将所有可能的结果穷举出来,然后根据正确结果的判断规则对这些结果逐个验证,从而找 出正确的结果.采用穷举的方法求解问题的答案比较适合计算机做,对这种体力活它们没有怨言,本文就 以常见的两个猜结果的题目为例,介绍一下如何通过计算机程序解决此类问题,顺便介绍一下穷举法常见 的算法结构和实现方式. 二. 猜结果游戏的分析过程 先来看一个问题,有五个运动员 (甲.乙.丙.丁.戊)参加运动会,分别获得了一百米

穷举法破解密码-MPI+VC6.0进行两台PC的并行计算,穷举法破解6-12位的密码(字母和数字组合)的MPI程序

问题描述 MPI+VC6.0进行两台PC的并行计算,穷举法破解6-12位的密码(字母和数字组合)的MPI程序 10C 需要分配任务,任务不知道怎么分配,我打算写控制台程序,先提示输入密码,用"*"显示,然后破解密码,显示密码是什么.怎么写这个程序啊,谢谢各位大神了.我在网上找了好多资料,可是估计是因为编程能力太差,实在写不出来啊.求大家帮帮忙,比较着急这个,谢谢 解决方案 我搭建好了MPI运行环境,只是遇到编程就傻了,实在编不出来,能给出程序吗?本身编程能力比较差,现在马上要交毕业设计

穷举法解24点游戏

24点游戏: 输入:n1,n2,n3,n4 输出:若能通过+ - * / 和括号混合运算,得到运算结果为24,则输出一个对应的运算表达式 穷举法: 对4个数字全排列有4!=24种排列. 4个数字共需要3个运算符,同一个运算符可以重复出现,则有4x4x4=64种情况. 对于4个数字而言,共有以下5中加括号的方式: (A(B(CD))),(A((BC)D)),((AB)(CD)),((A(BC))D),(((AB)C)D). 所以遍历的表达式最多有24*64*5=7680种.即使采用逆波兰表达式,总

《C语言及程序设计》实践项目——穷举法解题

返回:贺老师课程教学链接 说明:穷举法在有些时候,并不是一种最有效率的解决方案,但却是最直观的.初学者依靠这一组问题的解决,将获得程序设计的最直接体验,以及会想问题的头脑. [项目1-小明借书]小明有五本新书,要借给A,B,C三位小朋友,若每人每次只能借一本,则可以有多少种不同的借法?提示:本问题实际上是一个排列问题,即求从5个中取3个进行排列的方法的总数.首先对五本书从1至5进行编号,然后使用穷举的方法.假设三个人分别借这五本书中的一本,当三个人所借的书的编号都不相同时,就是满足题意的一种借阅

C++实践参考解答 穷举法解决组合问题

[项目:穷举法解决组合问题](自选两题完成,其他的想一想即可.当然,全做完收效更好)先阅读例题,领会穷举法(意为"穷尽式列举",也称枚举)的思想,然后自行选题进行解决,掌握这种程序设计的一般方法. 例题:小明有五本新书,要借给A,B,C三位小朋友,若每人每次只能借一本,则可以有多少种不同的借法? 问题分析与算法设计:本问题实际上是一个排列问题,即求从5个中取3个进行排列的方法的总数.首先对五本书从1至5进行编号,然后使用穷举的方法.假设三个人分别借这五本书中的一本,当三个人所借的书的编

要哭了,用穷举法写最长公共子序列

问题描述 网上都是动态规划..但我要穷举法啊在键盘上输入三个字符串,然后输出最长公共子序列...[输入输出样例]输入:cecqbhvaiaedpibalukcabegviapcihlaaugckadceevfdadaepcialaukd输出:Cevapiluk都想到淘宝上买了...可是没有一个店家理我...救我..... 解决方案 解决方案二:你知道查下线段树算法.网上应该有现成的.解决方案三:穷举法是暴力法吗?这个运行起来够吃力啊.这是我写的暴力法./**Tochangethislicense

用穷举法找出1到100的质数并显示出来

用穷举法找出1到100的质数并显示出来.分别使用while.do-while.for循环语句实现. 1.用while: include<iostream.h> void main() {int i,j,n,m; i=2; while(i<101) {m=1;n=i/2;j=2; while(j<=n) { if(i%j==0) {m=0; breake; } j++; } if(m) cout<<i<<""; i++; } } 2.用do

C++基本算法思想之穷举法_C 语言

穷举算法(Exhaustive Attack method)是最简单的一种算法,其依赖于计算机的强大计算能力来穷尽每一种可能性,从而达到求解问题的目的.穷举算法效率不高,但是适应于一些没有规律可循的场合. 穷举算法基本思想穷举算法的基本思想就是从所有可能的情况中搜索正确的答案,其执行步骤如下: (1)对于一种可能的情况,计算其结果. (2)判断结果是否符合要求,如果不满足则执行第(1)步来搜索下一个可能的情况:如果符合要求,则表示寻找到一个正确答案. 在使用穷举法时,需要明确问题的答案的范围,这

C语言及程序设计初步例程-40 穷举法解题

贺老师教学链接  C语言及程序设计初步 本课讲解 穷举法求解:百鸡百钱问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一.百钱买百鸡,问鸡翁.鸡母.鸡雏各几何? #include <stdio.h> int main() { int x,y,z; //定义数据类型为整型,买鸡和买烤鸡不是一个概念 for(x=0; x<=20; ++x) for(y=0; y<=33; ++y) //穷举中.... for(z=0; z<=100; ++z) if(5*x+3*y+z/3==100