1219: 速算24点【经典DFS】【分解的思想】

本文探讨了24点游戏的深度优先搜索策略,并介绍了分解思想在解题中的应用。通过A和B两位大佬的解读,阐述了如何扩展问题并解决不同情况,包括改变数值和增加运算数目的挑战。最后,提供了易于理解的代码实现。
摘要由CSDN通过智能技术生成

问题

1219: 速算24点
时间限制: 1 Sec  内存限制: 128 MB
提交: 381  解决: 89

速算24点相信绝大多数人都玩过。就是随机给你四张牌,包括 A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13)。要求只用'+','-','*','/'运算符以及括号改变运算 顺序,使得最终运算结果为24(每个数必须且仅能用一次)。游戏很简单,但遇到无解的情况往往让人很郁闷。你的任务就是针对每一组随机产生的四张牌,判断 是否有解。我们另外规定,整个计算过程中都不能出现小数。
输入
输入数据占一行,给定四张牌。
输出
如果有解则输出"Y",无解则输出"N"。
样例输入 Copy
A 2 3 6
样例输出 Copy
Y

A大佬代码

思路:

 多了处理字符串这一点,还有需要判断能否整除,
因为题目要求计算过程不能出现小数。
用数组存储这4个数
以及这4个数中任意两个之间的加减乘除的结果
(记录结果时,不要用数组下标自增一,
因为当前存储的结果 可能不是 正确达到24的中间的结果)。

每次取没有使用的两个数,继续进行加减乘除的操作。
等到使用数字个数达到4时,判断当前结果有没有达到24。  
注意过程中不能出现小数!
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

int num[10];//存储4个数字 和 通过数字得到的 结果 
bool vis[10];//标记当前数字 或者 结果是否使用过 

int toDec(char x);
int dfs(int use, int total);

int main()
{
   
	char a[4][2];
	int i, j;		
	while(scanf("%s%s%s%s", a[0], a[1], a[2], a[3]) != EOF) // 接收输入的字符串(10占两位)
	{
   
		for(i = 0; i < 4; i++)
		{
   
			if(strlen(a[i]) > 1)
			num[i] = 10;
			else
			num[i] = toDec(a[i][0]);
		}
		memset(vis, false, sizeof(vis));
		
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值