您的位置:首页 > 其它

算法设计与分析:第一张 算法分析介绍 1.3逻辑推理之谁能预测分数

2015-08-04 01:09 429 查看
/*
预测分数:
三维老师对某次学生竞赛进行了预测,他们预测如下:
甲说:学生A得第一名,学生B得第三名
乙说:学生C得第一名,学生D得第四名
丙说:学生D得第二名,学生A得第三名
竞赛结果表明,它们各说对了一般,说错了一半,并且无名次并列。试编程输入:a,b,c,d各自的名次

自己分析:
假设:X=i表明X学生的名次为i
那么甲的陈述可以表示为:A==1,B==3
    乙				  :C==1,D==4
	丙				  :D==2,A==3
	因为每个人均说对一半,这可以表示为,仍然是用逻辑值添加的方法
	用a,b,c,d表示4名同学,用存储的值表示他们的名次,则a + b + c + d = 1 + 2 + 3 + 4 = 10
	枚举法

输入:
输出:
a:4 b:3 c:1 d:2
*/

/*
关键:
1 对于非数值化的题目,转化为数值化:1)用字母对应的值表示名次,得分等,2)采用逻辑与的加法操作解决:说话一半对,4个人中一个说谎等,3)采用枚举法
2 if( ((a == 1) + (b == 3) == 1) && ((c == 1) + (d == 4) == 1) && (((d == 2) + (a == 3) == 1 ) ) )//解析问题:每人说对一半
3 	for(a = 1 ; a <= 4 ; a++)
	{
		for(b = 1 ; b <= 4 ; b++)
		{
			for(c = 1 ; c <= 4 ; c++)
			{
				if(a != b && b != c && c != a)//剪枝
				{
					d = 10 - a - b - c;
4 那么甲的陈述可以表示为:A==1,B==3
    乙				  :C==1,D==4
	丙				  :D==2,A==3
	因为每个人均说对一半,这可以表示为,仍然是用逻辑值添加的方法
	用a,b,c,d表示4名同学,用存储的值表示他们的名次,则a + b + c + d = 1 + 2 + 3 + 4 = 10
	枚举法
*/

#include <stdio.h>

bool check(int a,int b,int c,int d)
{
	if( ((a == 1) + (b == 3) == 1) && ((c == 1) + (d == 4) == 1) && (((d == 2) + (a == 3) == 1 ) ) )//解析问题:每人说对一半
	{
		return true;
	}
	else
	{
		return false;
	}
}

void process()
{
	int a,b,c,d;
	for(a = 1 ; a <= 4 ; a++)
	{
		for(b = 1 ; b <= 4 ; b++)
		{
			for(c = 1 ; c <= 4 ; c++)
			{
				if(a != b && b != c && c != a)//剪枝
				{
					d = 10 - a - b - c;
					if(check(a,b,c,d))
					{
						printf("a:%d b:%d c:%d d:%d\n",a,b,c,d);
						break;
					}
				}
			}
		}
	}
}

int main(int argc,char* argv[])
{
	process();
	getchar();
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: