ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CCF 201903-2 二十四点【枚举法】

2020-12-12 12:00:24  阅读:260  来源: 互联网

标签:二十四点 枚举法 s3 s2 s1 cal d4 CCF d2


目录

一、题目

在这里插入图片描述

二、解析

枚举法:
由题可知,输入固定为7个字符:d1、s1、d2、s2、d3、s3、d4。
其中,d1、d2、d3、d4是数字,s1、s2、s3是运算符号。
设运算符号x、/的等级为1,+、-的等级为0,则s1、s2、s3的组合有:
000 -> 0
001 -> 1
010 -> 10
011 -> 11
100 -> 100
101 -> 101
110 -> 110
111 -> 111
共8种。
枚举这8种运算即可。

三、代码

#include <iostream>
#include <map>

using namespace std;

int n;

int d1, d2, d3, d4;

char s1, s2, s3;

//运算符号的等级 
map<char, int> rank;

int cal(int n1, char s, int n2)
{
	int answer;
	switch (s) {
	case 'x':
		answer = n1 * n2;
		break;
	case '/':
		answer = n1 / n2;
		break;
	case '+':
		answer = n1 + n2;
		break;
	case '-':
		answer = n1 - n2;
		break;
	}
	return answer;
}

void calculate()
{
	int type = rank[s1] * 100 + rank[s2] * 10 + rank[s3];
	//cout<<type<<endl;
	int points;
	switch (type) {
	case 0:
		points = cal(cal(cal(d1, s1, d2), s2, d3), s3, d4);
		break;
	case 1:
		points = cal(cal(d1, s1, d2), s2, cal(d3, s3, d4));
		break;
	case 10:
		points = cal(cal(d1, s1, cal(d2, s2, d3)), s3, d4);
		break;
	case 11:
		points = cal(d1, s1, cal(cal(d2, s2, d3), s3, d4));
		break;
	case 100:
		points = cal(cal(cal(d1, s1, d2), s2, d3), s3, d4);
		break;
	case 101:
		points = cal(cal(d1, s1, d2), s2, cal(d3, s3, d4));
		break;
	case 110:
		points = cal(cal(cal(d1, s1, d2), s2, d3), s3, d4);
		break;
	case 111:
		points = cal(cal(cal(d1, s1, d2), s2, d3), s3, d4);
		break;
	}
	//cout<<points<<endl;
	if (points == 24)
		cout << "Yes" << endl;
	else
		cout << "No" << endl;
}

int main()
{
	rank['x'] = 1;
	rank['/'] = 1;
	rank['+'] = 0;
	rank['-'] = 0;

	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> d1 >> s1 >> d2 >> s2 >> d3 >> s3 >> d4;
		//cout<<d1<<s1<<d2<<s2<<d3<<s3<<d4<<endl;
		calculate();
	}

	return 0;
}

输入:

10
9+3+4x3
5+4x5x5
7-9-9+8
5x6/5x4
3+5+7+9
1x1+9-9
1x9-5/9
8/5+6x9
6x7-3x6
6x4+4/5

输出:

Yes
No
No
Yes
Yes
No
No
No
Yes
Yes

标签:二十四点,枚举法,s3,s2,s1,cal,d4,CCF,d2
来源: https://blog.csdn.net/weixin_43826681/article/details/111056149

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有