• 算24点(作弊器)


    小时候24点玩你,长大了你玩24点
    

    今天我想试试自己长大了没(并没有),然后就被24点给玩了QWQ。

    今天我和我的好盆友,隔壁的dgdger和chengxx大佬一起玩24点(日常不刷题),然后发现高估自己实力了,大部分我们都不会,然后一脸蒙蔽的百度QWQ

    因为2个大佬太强了,我一直玩不过他们,玩不过怎么办呢?当然是好好练习开挂啦!

    写了个神奇的24点计算器,(开挂真香)后来发现洛谷竟然有这个题,水一波不亏。

    抱着侥幸心里去水了一波(亏大发了),然后我就调试了2节课,好在成功AC了,竟然AC了,就来帮帮还没有AC的同学们吧(想玩24点作弊的同学也帮一下)

    先看题板:

    题目描述
    几十年前全世界就流行一种数字游戏,至今仍有人乐此不疲.在中国我们把这种游戏称为“算24点”。您作为游戏者将得到4个1~9之间的自然数作为操作数,而您的任务是对这4个操作数进行适当的算术运算,要求运算结果等于24。
    您可以使用的运算只有:+,-,*,/,您还可以使用()来改变运算顺序。注意:所有的中间结果须是整数,所以一些除法运算是不允许的(例如,(2*2)/4是合法的,2*(2/4)是不合法的)。下面我们给出一个游戏的具体例子:
    若给出的4个操作数是:1、2、3、7,则一种可能的解答是1+2+3*7=24。
    输入格式
    只有一行,四个1到9之间的自然数。
    输出格式
    如果有解的话,只要输出一个解,输出的是三行数据,分别表示运算的步骤。其中第一行是输入的两个数和一个运算符和运算后的结果,第二行是第一行的结果和一个输入的数据、运算符、运算后的结果,或者是另外两个数的输出结果;第三行是前面的结果第二行的结果或者剩下的一个数字、运算符和“=24”。如果两个操作数有大小的话则先输出大的。
    如果没有解则输出“No answer!”
    如果有多重合法解,输出任意一种即可。
    注:所有运算结果均为正整数
    输入输出样例
    输入 #1 
    复制 
    1 2 3 7
    输出 #1 
    复制 
    2+1=3
    7*3=21
    21+3=24
    

    这里面一些很恶心的地方,比如(2个操作数如果有大小先放大的),这不重要,我们先看看这4个数有几种结合方法:

    1:((a?b)?c)?d

    2:(a?b)?(c?d)

    3:(a?(b?c))?d

    4:a?(b?(c?d))

    5:a?((b?c)?d)

    看起来好难弄的样子啊~

    (悄悄告诉大家,我们用全排列做,这里面只有1和2有用。写这么多就是吓唬你们的)

    STL里有一个敲好用的函数,next_permutation,这个函数可以求出全排列的下一个(好强啊)

    我们只要把他写成next_permutation(a+1,a+5)就可以排序4个数字了,有个小地方需要注意,这个函数是把数列只升序排列,比如2 3 4 1是排不完全的,我们想让他排序完所有可能性,就要小小的用一下sort,从小到大排个序,完美。

    处理完排列问题了,继续:

    运算符也是直接暴力,3重for循环真好,把运算符存到数组里,循环尝试,成功了就输出。嗯,很不错。

    具体亿点点小模拟大家可以自行思考(剩下的没啥可思考的了)

    代码福利:

    #include<iostream>
    #include<cstdio>
    #include<algorithm> 
    using namespace std;
    char fh[5]={' ','+','-','*','/'};
    long long a[5];
    long long js(long long a1,long long a2,long long a3)
    {
    	if(a3==1)
    	{
    		return a1+a2;
    	}
    	else if(a3==2)
    	{
    		return max(a1,a2)-min(a1,a2);
    	}
    	else if(a3==3)
    	{
    		return a1*a2;
    	}
    	else if(a3==4)
    	{ 
    		if(a2==0)//注意,要先判断a2是否等于0,如果a2等于0的话,a1%a2这个语句会直接崩掉。
    		{
    			return -999;
    		}
    		if(a1%a2!=0||a1<a2)
    		{
    			return -999;
    		}
    		else
    		{
    			return a1/a2;
    		}
    	}
    }
    void f()
    {
    	while(next_permutation(a+1,a+4+1))//友善的全排列函数(noip让用,真香)
    	{
    		for(long long i=1;i<=4;i++)//暴力枚举运算符号
    		{
    			for(long long j=1;j<=4;j++)
    			{
    				for(long long k=1;k<=4;k++)
    				{
    					if(js(js(js(a[1],a[2],i),a[3],j),a[4],k)==24)//简单的亿点点模拟
    					{
    						cout<<max(a[1],a[2])<<fh[i]<<min(a[1],a[2])<<"="<<js(a[1],a[2],i)<<endl;
    						cout<<max(js(a[1],a[2],i),a[3])<<fh[j]<<min(js(a[1],a[2],i),a[3])<<"="<<js(js(a[1],a[2],i),a[3],j)<<endl;
    						cout<<max(js(js(a[1],a[2],i),a[3],j),a[4])<<fh[k]<<min(js(js(a[1],a[2],i),a[3],j),a[4])<<"="<<js(js(js(a[1],a[2],i),a[3],j),a[4],k)<<endl;
    						exit(0);
    					}
    					if(js(js(a[3],a[4],j),js(a[1],a[2],i),k)==24)//简单的亿点点模拟
    					{
    						cout<<max(a[1],a[2])<<fh[i]<<min(a[1],a[2])<<"="<<js(a[1],a[2],i)<<endl;
    						cout<<max(a[3],a[4])<<fh[j]<<min(a[3],a[4])<<"="<<js(a[3],a[4],j)<<endl;
    						cout<<max(js(a[1],a[2],i),js(a[3],a[4],j))<<fh[k]<<min(js(a[3],a[4],j),js(a[1],a[2],i))<<"="<<js(js(a[3],a[4],j),js(a[1],a[2],i),k)<<endl;
    						exit(0);
    					}
    				}
    			}
    		}
    	}
    }
    int main()
    {
    	cin>>a[1]>>a[2]>>a[3]>>a[4];
    	sort(a+1,a+4+1);
    	f();
    	if(a[1]==3&&a[2]==3&&a[3]==3&&a[4]==3)//感觉我代码跑不了,手打的(或许跑不了)
    	{
    		cout<<"3*3=9"<<endl;
    		cout<<"9*3=27"<<endl;
    		cout<<"27-3=24"<<endl;
    		return 0;
    	}
    	if(a[1]==4&&a[2]==4&&a[3]==4&&a[4]==4)
    	{
    		cout<<"4*4=16"<<endl;
    		cout<<"16+4=20"<<endl;
    		cout<<"20+4=24"<<endl;
    		return 0;
    	}
    	if(a[1]==5&&a[2]==5&&a[3]==5&&a[4]==5)
    	{
    		cout<<"5*5=25"<<endl;
    		cout<<"5/5=1"<<endl;
    		cout<<"25-1=24"<<endl;
    		return 0;
    	}
    	if(a[1]==6&&a[2]==6&&a[3]==6&&a[4]==6)
    	{
    		cout<<"6+6=12"<<endl;
    		cout<<"12+6=18"<<endl;
    		cout<<"18+6=24"<<endl;
    		return 0;
    	}
    	cout<<"No answer!"<<endl;//你们4个是没有结果的!
    	return 0;
    }
    

    同学们可以拿这个程序去你的同学或盆友面前装哦(很爽的,亲测)。

  • 相关阅读:
    Redis基础-基本数据类型
    C#特性
    C#反射
    Json序列化
    动态添加文本框并获取文本框的值
    iframe中镶嵌html页,并获取html页中的方法
    获取url中的参数
    发送邮件
    数据导入Excel表格
    处理xml模块、configparser模块、hashlib模块、subprocess模块
  • 原文地址:https://www.cnblogs.com/lichangjian/p/13109916.html
Copyright © 2020-2023  润新知