猫史档案馆


算24点!真正的编程!为C党,C++党,Pascal党,Python党等喝彩!

用户:已退坑已退坑查看:18 回复:8 评论:18 创建时间:2019-11-03T20:02:46


我刚刚编的《算24点》程序,这才是真正的编程!

C++代码如下:(Python代码正在编写)

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int a1[5];
char op[5];
bool isfinish=false;
int plus1(int a,int b){
	if(a<b)return -1;
	return a+b;
}
int minus1(int a,int b){
	if(a<=b)return -1;
	return a-b;
}
int multiply1(int a,int b){
	if(a<b)return -1;
	return a*b;
}
int divide1(int a,int b){
	if(b==0||a%b)return -1;
	return a/b;
}
int asdf(int a,int b,char o){
	if(a==-1||b==-1)return -1;
	else if(o=='+')return plus1(a,b);
	else if(o=='-')return minus1(a,b);
	else if(o=='*')return multiply1(a,b);
	else if(o=='/')return divide1(a,b); 
}
void print(int k){
	isfinish=true;
	int ans,ans2;
	if(k==0){
		cout<<a1[0]<<op[1]<<a1[1]<<'=';
		ans=asdf(a1[0],a1[1],op[1]);
		cout<<ans<<endl;
		cout<<ans<<op[2]<<a1[2]<<'=';
		ans=asdf(ans,a1[2],op[2]);
		cout<<ans<<endl;
		cout<<ans<<op[3]<<a1[3]<<'=';
		ans=asdf(ans,a1[3],op[3]);
		cout<<ans<<endl;
	}
	if(k==1){
		cout<<a1[1]<<op[2]<<a1[2]<<'=';
		ans=asdf(a1[1],a1[2],op[2]);
		cout<<ans<<endl;
		cout<<a1[0]<<op[1]<<ans<<'=';
		ans=asdf(a1[0],ans,op[1]);
		cout<<ans<<endl;
		cout<<ans<<op[3]<<a1[3]<<'=';
		ans=asdf(ans,a1[3],op[3]);
		cout<<ans<<endl;
	}
	if(k==2){		
		cout<<a1[1]<<op[2]<<a1[2]<<'=';
		ans=asdf(a1[1],a1[2],op[2]);
		cout<<ans<<endl;
		cout<<ans<<op[3]<<a1[3]<<'=';
		ans=asdf(ans,a1[3],op[3]);
		cout<<ans<<endl;
		cout<<a1[0]<<op[1]<<ans<<'=';
		ans=asdf(a1[0],ans,op[1]);
		cout<<ans<<endl;
	}
	if(k==3){
		cout<<a1[0]<<op[1]<<a1[1]<<'=';
		ans=asdf(a1[0],a1[1],op[1]);
		cout<<ans<<endl;
		cout<<a1[2]<<op[3]<<a1[3]<<'=';
		ans2=asdf(a1[2],a1[3],op[3]);
		cout<<ans2<<endl;
		cout<<ans<<op[2]<<ans2<<'=';
		ans=asdf(ans,ans2,op[2]);
		cout<<ans<<endl;
	}
	if(k==4){
		cout<<a1[2]<<op[3]<<a1[3]<<'=';
		ans=asdf(a1[2],a1[3],op[3]);
		cout<<ans<<endl;
		cout<<a1[1]<<op[2]<<ans<<'=';
		ans=asdf(a1[1],ans,op[2]);
		cout<<ans<<endl;
		cout<<a1[0]<<op[1]<<ans<<'=';
		ans=asdf(a1[0],ans,op[1]);
		cout<<ans<<endl;
	}	
	return;
}
void asdfasdf(int k){
	int ans,ans2;
	if(k==0){
		ans=asdf(a1[0],a1[1],op[1]);
		ans=asdf(ans,a1[2],op[2]);
		ans=asdf(ans,a1[3],op[3]);
		if(ans==24)print(k);
	}
	if(k==1){
		ans=asdf(a1[1],a1[2],op[2]);
		ans=asdf(a1[0],ans,op[1]);
		ans=asdf(ans,a1[3],op[3]);
		if(ans==24)print(k);
	}
	if(k==2){
		ans=asdf(a1[1],a1[2],op[2]);
		ans=asdf(ans,a1[3],op[3]);
		ans=asdf(a1[0],ans,op[1]);
		if(ans==24)print(k);
	}
	if(k==3){
		ans=asdf(a1[0],a1[1],op[1]);
		ans2=asdf(a1[2],a1[3],op[3]);
		ans=asdf(ans,ans2,op[2]);
		if(ans==24)print(k);
	}
	if(k==4){
		ans=asdf(a1[2],a1[3],op[3]);
		ans=asdf(a1[1],ans,op[2]);
		ans=asdf(a1[0],ans,op[1]);
		if(ans==24)print(k);
	}
	return;
}
void lined2(int sum){
	if(sum==4){
		for(int kk=0;kk<5;kk++){
			asdfasdf(kk);
			if(isfinish)return;
		}
	}
	else{
		op[sum]='+';
		lined2(sum+1);
		if(isfinish)return;
		op[sum]='-';
		lined2(sum+1);
		if(isfinish)return;
		op[sum]='*';
		lined2(sum+1);
		if(isfinish)return;
		op[sum]='/';
		lined2(sum+1);
		if(isfinish)return;
		op[sum]=' ';
	}
}
void lined1(){
	do{
    	lined2(1);
    	if(isfinish)return;
	}while(next_permutation(a1,a1+4));
}
int main(){
	for(int i=0;i<4;i++)cin>>a1[i];
	sort(a1,a1+4);
	lined1();
	if(isfinish==false)cout<<"No answer!";
	return 0;
}


回复

上一页1 页 / 共 1下一页
宇轩yu_xuan宇轩yu_xuan

代码是不是错了啊,编译之后运行一下就退了

 

 

点赞0


评论


天马神坑_真天马神坑_真

你好,请问您愿意加入CJW工作室吗,我们是专门研究C++,Python的

 

如果有志向,请发布一个您的代表作(必须原创)源代码,审核通过即可加入!

 

点赞0


评论


星空辰光星空辰光

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int a1[5];
char op[5];
bool isfinish=false;
int plus1(int a,int b){
	if(a<b)return -1;
	return a+b;
}
int minus1(int a,int b){
	if(a<=b)return -1;
	return a-b;
}
int multiply1(int a,int b){
	if(a<b)return -1;
	return a*b;
}
int divide1(int a,int b){
	if(b==0||a%b)return -1;
	return a/b;
}
int asdf(int a,int b,char o){
	if(a==-1||b==-1)return -1;
	else if(o=='+')return plus1(a,b);
	else if(o=='-')return minus1(a,b);
	else if(o=='*')return multiply1(a,b);
	else if(o=='/')return divide1(a,b); 
}
void print(int k){
	isfinish=true;
	int ans,ans2;
	if(k==0){
		cout<<a1[0]<<op[1]<<a1[1]<<'=';
		ans=asdf(a1[0],a1[1],op[1]);
		cout<<ans<<endl;
		cout<<ans<<op[2]<<a1[2]<<'=';
		ans=asdf(ans,a1[2],op[2]);
		cout<<ans<<endl;
		cout<<ans<<op[3]<<a1[3]<<'=';
		ans=asdf(ans,a1[3],op[3]);
		cout<<ans<<endl;
	}
	if(k==1){
		cout<<a1[1]<<op[2]<<a1[2]<<'=';
		ans=asdf(a1[1],a1[2],op[2]);
		cout<<ans<<endl;
		cout<<a1[0]<<op[1]<<ans<<'=';
		ans=asdf(a1[0],ans,op[1]);
		cout<<ans<<endl;
		cout<<ans<<op[3]<<a1[3]<<'=';
		ans=asdf(ans,a1[3],op[3]);
		cout<<ans<<endl;
	}
	if(k==2){		
		cout<<a1[1]<<op[2]<<a1[2]<<'=';
		ans=asdf(a1[1],a1[2],op[2]);
		cout<<ans<<endl;
		cout<<ans<<op[3]<<a1[3]<<'=';
		ans=asdf(ans,a1[3],op[3]);
		cout<<ans<<endl;
		cout<<a1[0]<<op[1]<<ans<<'=';
		ans=asdf(a1[0],ans,op[1]);
		cout<<ans<<endl;
	}
	if(k==3){
		cout<<a1[0]<<op[1]<<a1[1]<<'=';
		ans=asdf(a1[0],a1[1],op[1]);
		cout<<ans<<endl;
		cout<<a1[2]<<op[3]<<a1[3]<<'=';
		ans2=asdf(a1[2],a1[3],op[3]);
		cout<<ans2<<endl;
		cout<<ans<<op[2]<<ans2<<'=';
		ans=asdf(ans,ans2,op[2]);
		cout<<ans<<endl;
	}
	if(k==4){
		cout<<a1[2]<<op[3]<<a1[3]<<'=';
		ans=asdf(a1[2],a1[3],op[3]);
		cout<<ans<<endl;
		cout<<a1[1]<<op[2]<<ans<<'=';
		ans=asdf(a1[1],ans,op[2]);
		cout<<ans<<endl;
		cout<<a1[0]<<op[1]<<ans<<'=';
		ans=asdf(a1[0],ans,op[1]);
		cout<<ans<<endl;
	}	
	return;
}
void asdfasdf(int k){
	int ans,ans2;
	if(k==0){
		ans=asdf(a1[0],a1[1],op[1]);
		ans=asdf(ans,a1[2],op[2]);
		ans=asdf(ans,a1[3],op[3]);
		if(ans==24)print(k);
	}
	if(k==1){
		ans=asdf(a1[1],a1[2],op[2]);
		ans=asdf(a1[0],ans,op[1]);
		ans=asdf(ans,a1[3],op[3]);
		if(ans==24)print(k);
	}
	if(k==2){
		ans=asdf(a1[1],a1[2],op[2]);
		ans=asdf(ans,a1[3],op[3]);
		ans=asdf(a1[0],ans,op[1]);
		if(ans==24)print(k);
	}
	if(k==3){
		ans=asdf(a1[0],a1[1],op[1]);
		ans2=asdf(a1[2],a1[3],op[3]);
		ans=asdf(ans,ans2,op[2]);
		if(ans==24)print(k);
	}
	if(k==4){
		ans=asdf(a1[2],a1[3],op[3]);
		ans=asdf(a1[1],ans,op[2]);
		ans=asdf(a1[0],ans,op[1]);
		if(ans==24)print(k);
	}
	return;
}
void lined2(int sum){
	if(sum==4){
		for(int kk=0;kk<5;kk++){
			asdfasdf(kk);
			if(isfinish)return;
		}
	}
	else{
		op[sum]='+';
		lined2(sum+1);
		if(isfinish)return;
		op[sum]='-';
		lined2(sum+1);
		if(isfinish)return;
		op[sum]='*';
		lined2(sum+1);
		if(isfinish)return;
		op[sum]='/';
		lined2(sum+1);
		if(isfinish)return;
		op[sum]=' ';
	}
}
void lined1(){
	do{
    	lined2(1);
    	if(isfinish)return;
	}while(next_permutation(a1,a1+4));
}
int main(){
	for(int i=0;i<4;i++)cin>>a1[i];
	sort(a1,a1+4);
	lined1();
	if(isfinish==false)cout<<"No answer!";
	return 0;
}

点赞0


评论


星空之忆星空之忆

应该说为所有代码党喝彩

点赞0


评论


Lonely_wandererLonely_wanderer

我也搞过,做过一个日期的

点赞0


评论


一个STUB用户_6923702一个STUB用户_6923702

我们应该清理代码区的水贴!

点赞0


评论


爱探险的可乐呀爱探险的可乐呀

Python代码在这里~我已经编好了

#二十四点
import os
import time
from time import sleep
from time import perf_counter
 
 
global Goal,MaxAllowRetryNum,Count
Goal,MaxAllowRetryNum,Count=24,3,0
 
#输出程序相关信息
def ptintInfo():
    print('''" 经典 24 点 "''')
    print(" 请用户输入四个正整数值 ")
    print(" 单个数值提供三试错机会。若机会用完,程序倒计时5秒退出 ")
    print(" 将输出所有的24点方案,并对方案进行计数 ")
    print(" 若无方案,程序退出,输出0 ")
 
 
def printSatistics(times):
    print("一共有{}种方案".format(Count))
 
#得到四个用户输入值
def getNumbers():
    a=getOneNumber("一") 
    b=getOneNumber("二") 
    c=getOneNumber("三") 
    d=getOneNumber("四") 
    print("输入的数值为:"+a+','+b+','+c+','+d)
    return a+' '+b+' '+c+' '+d
 
 #得到单个用户输入值
 #单个提供三次试错机会,(不包括第一次输入)
 #试错机会用完后,程序倒计时五秒强制退出
def getOneNumber(temp):
    global MaxAllowRetryNum
    for tryies in range(MaxAllowRetryNum+1):
        num=input("请输入第{}个值:".format(temp))
        try:
            num=int(eval(num))
            if num > 0:
                break
            else:
                print("请核对输入信息,还剩余{}次机会".format(MaxAllowRetryNum-tryies))
        except:
            print("请核对输入信息,还剩余{}次机会".format(MaxAllowRetryNum-tryies))
        if tryies == MaxAllowRetryNum:
                for i in range(5):
                    print("\r所有次数已用完,程序将在{}秒后退出".format(5-i))
                    sleep(1)
                print("\n")
                os._exit(0)
    return str(num)
 
#穷举所有的数值列表
#共4!=24种
def getNumList(numbers):
    items=numbers.split()
#四重循环遍历穷举所有的数值组合
    #data_list = []
    # for i in range(4):
    #     for j in range(4): 
    #         if i!=j:
    #             for p in range(4):
    #                 if p!=i and p!=j:
    #                     for q in range(4):
    #                         if q!=i and q!=j and q!=p:
    #                             data_list.append(items[i]+' '+items[j]+' '+items[p]+' '+items[q])
    data_list = [(items[i]+' '+items[j]+' '+items[p]+' '+items[q]) for i in range(4) for j in range(4) for p in range(4) for q in range(4) if (i != j) &(i != p) &(i != q) &(j != p) &(j != q) &(p != q)]
#使用set方法排除冗余的数字组合
#当输入的数字中存在重复数字,则4!=24种排序方案会存在重复,必须排除
    return set(data_list)
 
#穷举所有的操作符列表
#共4x4x4=喵种
def getOplist(ops):
    # op_list_orgin=ops
    # op_list=[]
#三重循环遍历穷举
    # for i in range(4):
    #     for j in range(4):
    #         for p in range(4):
    #             item=str(op_list_orgin[i])+' '+str(op_list_orgin[j])+' '+str(op_list_orgin[p])
    #             op_list.append(item)
    op_list=[ops[i]+' '+ops[j]+' '+ops[p] for i in range(4) for j in range(4) for p in range(4)]
    return op_list
 
#计算24点
def Cal(num_list,opt_list):
    for numlist in num_list:
        nums=numlist.split()
        for oplist in opt_list:
            ops=oplist.split()
            Cal24(nums,ops)
 
 
#对单种运算符顺序和单种数字顺序进行组合运算
def Cal24(nums,op):
    global Goal,Count
 
#第一种情况 ((num0 op0 num1)op1 num2)op2 num3
    try:
        if round(eval("(("+nums[0]+op[0]+nums[1]+")"+op[1]+nums[2]+")"+op[2]+nums[3]),0) == Goal:
            Count+=1
            print("(({}{}{}){}{}){}{}={}".format(\
                nums[0], op[0], nums[1], op[1], nums[2], op[2], nums[3], Goal))
    except:
        pass
 
#第二种情况 (num0 op0 num1) op1 (num2 op2 num3)
    try:
        if round(eval("("+nums[0]+op[0]+nums[1]+")"+op[1]+"("+nums[2]+op[2]+nums[3]+")"), 0) == Goal:
            Count += 1
            print("({}{}{}){}({}{}{})={}".format(\
                nums[0], op[0], nums[1], op[1], nums[2], op[2], nums[3], Goal))
    except:
        pass
 
#第三种情况 ( num0 op0 ( num1 op1 num2 )) op2 num3
    try:
        if round(eval("("+nums[0]+op[0]+"("+nums[1]+op[1]+nums[2]+"))"+op[2]+nums[3]), 0) == Goal:
            Count += 1
            print("({}{}({}{}{})){}{}={}".format(\
                nums[0], op[0], nums[1], op[1], nums[2], op[2], nums[3], Goal))
    except:
        pass
 
#第四种情况 num0 op0 (( num1 op1 num2 ) op2 num3 )
    try:
        if round(eval(nums[0]+op[0]+"(("+nums[1]+op[1]+nums[2]+")"+op[2]+nums[3]+")"), 0) == Goal:
            Count += 1
            print("{}{}(({}{}{}){}{})={}".format(\
                nums[0], op[0], nums[1], op[1], nums[2], op[2], nums[3], Goal))
    except:
        pass
 
#第五种情况 num0 op0 ( num1 op1 ( num2 op2 num3 ))
    try:
        if round(eval(nums[0]+op[0]+"("+nums[1]+op[1]+"("+nums[2]+op[2]+nums[3]+"))"), 0) == Goal:
            Count += 1
            print("{}{}({}{}({}{}{}))={}".format(\
                nums[0], op[0], nums[1], op[1], nums[2], op[2], nums[3], Goal))
    except:
        pass
 
 
if __name__ == '__main__':
    ptintInfo()
    numbers=getNumbers()
    start=perf_counter()
    num_list=getNumList(numbers)
    opt_list=getOplist('+-*/')
    Cal(num_list,opt_list)
    printSatistics(perf_counter()-start)

点赞0


评论


煤黑烧饼煤黑烧饼

真就硬穷举啊。。。

点赞0


评论