首页 > 试题广场 >

扑克牌四则运算

[编程题]扑克牌四则运算
  • 热度指数:1751 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
现在有一幅扑克牌,去掉大小王52张牌。随机选出4张牌,可以任意改变扑克牌的顺序,并填入 + - * / 四个运算符,不用考虑括号,除法按整数操作,计算过程中没有浮点数,问是否能够求值得到给定的数m。

输入描述:
一行四个数字 (JQK 分别被替换成11,12,13)单空格分割,另一行输入 m


输出描述:
可以输出1
否则输出0
示例1

输入

13 13 13 13 
24

输出

0

备注:
提示:
注意运算符优先级
from itertools import permutations
while 1:
    try:
        nums = list(map(int, input().split()))
        m = int(input())
        sta = False
        def dfs(nums, i, temp):
            if i == len(nums)-1:
                if eval(temp) == m:
                    global sta
                    sta = True
                return
            dfs(nums, i+1, temp+'+%d'%nums[i+1])
            dfs(nums, i+1, temp+'-%d'%nums[i+1])
            dfs(nums, i+1, temp+'*%d'%nums[i+1])
            dfs(nums, i+1, temp+'//%d'%nums[i+1])

        for ls in permutations(nums):
            dfs(ls, 0, 'nums[0]')
            if sta:
                break
        if sta:
            print('1')
        else:
            print('0')
    except EOFError:
        break

发表于 2020-09-08 16:01:36 回复(0)
""""
DFS 对扑克顺序深搜,每种选择夹带4种情况运算符
暴力枚举应该也可以,扑克顺序4*3*2*1,运算符4*4*4,
"""


def dfs(ss, a, vis, m, step):
    for i in range(len(a)):
        if not vis[i]:
            continue
        vis[i] = False
        s = ss + a[i]
        if step == 3:
            if eval(s) == m:
                return True
            else:
                vis[i] = True
                continue
        res = dfs(s + '+', a, vis, m, step + 1) or dfs(s + '-', a, vis, m, step + 1) or \
              dfs(s + '*', a, vis, m, step + 1) or dfs(s + '//', a, vis, m, step + 1)
        vis[i] = True
        if res: return True
    return False


if __name__ == "__main__":
    a = input().strip().split()
    m = int(input())
    vis = [True] * len(a)
    ans = dfs("", a, vis, m, 0)
    print(1 if ans else 0)

编辑于 2019-07-15 18:59:00 回复(0)
非常惭愧,没有用什么高超诡谲的算法,直接暴力枚举竟然过了
from itertools import permutations

# 直接暴力枚举
def solve(nums, m):
    # 生成所有数字排列
    for data in permutations(nums):
        for op1 in ['+', '-', '*', '//']:
            for op2 in ['+', '-', '*', '//']:
                for op3 in ['+', '-', '*', '//']:
                    if m == eval(str(data[0]) + op1 + str(data[1]) + op2 + str(data[2]) + op3 + str(data[3])):
                        return 1
    return 0

nums = list(map(int, input().split()))
m = int(input())
print(solve(nums, m))


发表于 2020-10-25 22:14:42 回复(0)
#include <bits/stdc++.h>
using namespace std;

int m;
set<int> S{0,1,2,3};
bool DFS(int *a, int p, int t){
    if(S.empty())
        return p+t==m;
    vector<int> v(S.begin(), S.end());
    for(int i=0;i<v.size();i++){
        int x = v[i];
        S.erase(x);
        if(DFS(a, a[x], p+t))
            return true;
        if(DFS(a, -a[x], p+t))
            return true;
        if(DFS(a, p*a[x], t))
            return true;
        if(DFS(a, p/a[x], t))
            return true;
        S.insert(x);
    }
    return false;
}

int main(){
    int a[4];
    for(int i=0;i<4;i++)
        cin>>a[i];
    cin>>m;
    cout<<DFS(a, 0, 0)<<endl;
}

编辑于 2020-01-19 01:47:55 回复(1)
通用递归方法
# 深度优先
from itertools import permutations
data=[i for i in input().split()]
target=int(input())
find=0
def rec(index,res):
    global find
    if len(res)==2*n-1:
        if eval("".join(res))==target&nbs***bsp;find:
            find=1
            return
        else:
            return
    for i in ["+","-","*","//"]:
            res.append(i)
            res.append(cur[index])
            rec(index+1,res)
            res[:]=res[:-2] 
n=len(data)
for cur in permutations(data):
    if not find:
        rec(1,[cur[0]])
    else:
        break
print(find)

发表于 2022-09-07 13:09:18 回复(0)
#include <iostream>
#include <sstream>
#include <climits>
#include <vector>
#include <string>
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>
#include <algorithm>
#include <stack>
#include <queue>
#include <stdio.h>

using namespace std;

bool dfs(const vector<int>& nums, unordered_set<int>& s, int p, int pp, int M) {
	if (s.empty()) return (p + pp) == M;
    vector<int> v(s.begin(), s.end());
	for (auto i: v) {
        s.erase(i);
		if (dfs(nums, s, nums[i], p + pp, M)) return true;
		if (dfs(nums, s, -nums[i], p + pp, M)) return true;
		if (dfs(nums, s, p * nums[i], pp, M)) return true;
		if (dfs(nums, s, p / nums[i], pp, M)) return true;
        s.insert(i);
	}
	return false;
}

void solve(const vector<int>& nums, int M) {
    unordered_set<int> s{0, 1, 2, 3};
	bool res = dfs(nums, s, 0, 0, M);
	cout << (res ? 1 : 0) << endl;
}

int main() {
	vector<int> nums(4, 0);
	for (int i = 0; i < 4; ++i) {
		cin >> nums[i];
	}
	int M;
	cin >> M;
	solve(nums, M);
    return 0;
}

发表于 2019-11-21 23:12:47 回复(0)
arr = list(map(int, input().split(" ")))
target = int(input())

expressions = []

def dfs(i, s):
	if(i == 4):
		expressions.append(s)
		return
	stemp = str(arr[i])
	dfs(i + 1, s + "+" + stemp)
	dfs(i + 1, s + "-" + stemp)
	dfs(i + 1, s + "*" + stemp)
	dfs(i + 1, s + "//" + stemp)

def solve():
	s = str(arr[0])
	expressions.clear()
	dfs(1, s)
	flag = True
	for e in expressions:
		if(eval(e) == target):
			return True
	return False

def Prim(i):
	if i == 4:
		if solve():
			return True
		else:
			return False
	k = i
	while k < 4:
		arr[k], arr[i] = arr[i], arr[k]
		if Prim(i + 1):
			return True
		arr[k], arr[i] = arr[i], arr[k]
		k += 1
	return False
	
if Prim(0):
	print("1")
else:
	print("0")

发表于 2019-10-31 08:36:22 回复(0)
#include<iostream>
using namespace std;

int f(int n1,int n2,int a);
int main()
{
 int d[4];
 for(int i=0;i<4;i++)
  cin>>d[i];
 int n,m,m1,m2,m3;
 bool flag=0;
 cin>>n;
 for(int d1=0;d1<4;d1++)
  for(int d2=0;d2<4;d2++)
   for(int d3=0;d3<4;d3++)
    for(int d4=0;d4<4;d4++)
    {
     if(d1!=d2&&d1!=d3&&d1!=d4&&d2!=d4&&d2!=d3&&d3!=d4)
     {
      for(int i=0;i<4;i++)
       for(int j=0;j<4;j++)
        for(int k=0;k<4;k++)
        {
         m=f(f(f(d[d1],d[d2],i),d[d3],j),d[d4],k);
                                    m1=f(f(d[d1],d[d2],i),f(d[d3],d[d4],j),k);
                                    m2=-m;
                                    m3=-m1;
         if(m==n||m1==n||m2==n||m3==n)
                                    flag=1;
        }if(flag==1)break;
     }if(flag==1)break;
    }
     if(flag) cout<<(int)flag;
  else cout<<(int)flag;
  system("pause");
  return 0;
}
int f(int n1,int n2,int a)
{
 int s;
 switch(a)
 {
  case 0:s=n1+n2;
   break;
  case 1:s=n1-n2;
   break;
  case 2:s=n1*n2;
   break;
  case 3:if(n2!=0) s=n1/n2;
      else s=0;
   break;
 }
 return s;
}
发表于 2019-08-03 18:41:54 回复(1)
枚举就好,计算量不大
发表于 2019-07-05 16:39:21 回复(0)
step1:求出数字和字符的所有排列情况,因为情况不复杂可以考虑暴力循环实现,同时也不需要剪枝节省时间
step2:对于每一种情况计算答案,因为没有括号,不需要转成后缀表达式计算
简单写了下代码:
# -*- coding: utf-8 -*-
"""
Created on Mon Apr  1 00:54:31 2019
@author: Administrator
"""
data = [int (i) for i in input().split()]
m = int(input())
def f(n1,n2,op):
    if op=="+":
        return n1+n2
    elif op=="-":
        return n1-n2
    elif op=="*":
        return n1*n2
    elif op=="/":
        if n2 == 0:
            return -999999
        return n1//n2
def cal(data):
    flag = True 
    while flag:
        flag = False
        for i in range(len(data)):
            if data[i] in ["*","/"]:
#                print(data[i])
                data = data[0:i-1] + [f(data[i-1],data[i+1],data[i])] + data[i+2:]
                flag = True
                break          
    while len(data)>1:
        for i in range(len(data)):
            if data[i] in ["+","-"]:
                data = data[0:i-1] + [f(data[i-1],data[i+1],data[i])] + data[i+2:]
                break
#                print(data)
    return data[0]
        
#print(cal([1,"+",2,"-",5]))
flag = 0
def A(data):
    if len(data)==1:
        return [data]
    else:
        finalRes = []
        for i in range(len(data)):
            newData = data[0:i]+data[i+1:]
            res = A(newData)
            for j in range(len(res)):
                res[j].insert(0,data[i])
            finalRes.extend(res)
        return finalRes          
            
for op1 in ["+","-","*","/"]:
    for op2 in ["+","-","*","/"]:
        for op3 in ["+","-","*","/"]:
            for nums in A(data):
                res = cal([nums[0],op1,nums[1],op2,nums[2],op3,nums[3]])
                if res == m:
                    flag = 1
print(flag)

发表于 2019-04-01 01:44:57 回复(1)