zoukankan      html  css  js  c++  java
  • P1236 算24点

    应某yjk大佬的邀请,特来水一水做一做这道题

    二话不说就是暴力

    我的思路是,对于每次运算出来的结果,就当成一个新数。在加入枚举

    具体的会写在mama里

    #include<iostream> 
    #include<algorithm>
    #include<cstdio>
    using namespace std;
    char cs[60];//存符号的数组
    int ns[60][2];//存每次运算的数字,都是倒序存。举个栗子:第一次运算存在ns[4][1]和ns[4][0]里的
    bool exi=false;
    bool used[100];//是否被使用,由于我们需要将运算的结果看成新的数,所以要开大一些
    int num[100];//存数字
    int top;
    bool compare(const int &a,const int &b)
    {
    	return a<b;
    }
    void dfs(int now)//now为还需要进行的运算次数
    {
    	if(now==1)//我这里是码风的问题,其实进入到这个循环里就需要三步运算
    	{
    		if(num[top]==24)//有解
    		{
    			exi=true;//标记打上233
    			for(int i=4;i>=2;i--)//暴力输出233
    			{
    				printf("%d%c%d=",ns[i][0],cs[i],ns[i][1]);
    				switch(cs[i])
    				{
    					case '+':printf("%d",ns[i][0]+ns[i][1]);break;
    					case '-':printf("%d",ns[i][0]-ns[i][1]);break;
    					case '/':printf("%d",ns[i][0]/ns[i][1]);break;
    					case '*':printf("%d",ns[i][0]*ns[i][1]);break;
    				}
    				printf("
    ");
    			}
    		}
    		return ;
    	}
    	for(int i=1;i<=top;i++)//每次dfs枚举两个参与预算的数
    		if(!used[i])
    		{
    			used[i]=true;
    			for(int j=1;j<=top;j++)
    				if(!used[j])
    				{
    					ns[now][0]=num[i];
    					ns[now][1]=num[j];
    					used[j]=true;
    					top+=1;//num中元素的个数+1
    					if(num[i]>=num[j])//为了输出个数
    					{
    						num[top]=num[i]+num[j];
    						cs[now]='+';
    						dfs(now-1);
    						if(exi)
    						return ;
    					}
    					if(num[i]-num[j]>=0)//保证不为零
                        //如果没有的话样例会变成
                        //1-2=-1
                        //7--1=8
                        //8*3=24   蛤蛤
    					{
    						num[top]=num[i]-num[j];
    						cs[now]='-';
    						dfs(now-1);
    						if(exi)
    							return ;
    					}
    					if(num[i]>=num[j])//保证输出
    					{	
    						num[top]=num[i]*num[j];
    						cs[now]='*';
    						dfs(now-1);
    						if(exi)
    							return ;
    					}
    					if(num[j]&&num[i]%num[j]==0)//防止除数为零导致错误
    					{
    						num[top]=num[i]/num[j];
    						cs[now]='/';
    						dfs(now-1);
    						if(exi)
    							return ;
    					}
    					used[j]=false;
    					top-=1;
    				}
    			used[i]=false;
    		}
    }
    int main()
    {
    	for(int i=1;i<=4;i++)
    		scanf("%d",&num[i]);//输入
    	top=4;//现在一共有多少个数。以后的结果会加到num数组里,所以说top就是num数组中元素的个数。
    	sort(num+1,num+5,compare);//好像并没有什么用的排序
    	dfs(4);//4の意义见函数本体
    	if(!exi)//exi为是否找到了解
    		printf("No answer!");
    	return 0;
    }
    
    
  • 相关阅读:
    转 oracle catalog 库常用脚本
    转 【ORACLE】ORA-12537 问题整理
    转 Trace a specific ORA- error
    15%
    MySQL 存储过程
    MySQL 命令行客户机的分隔符
    MySQL 连接join
    MySQL 正则表达式
    MySQL 日期时间函数
    Arthas 快速入门
  • 原文地址:https://www.cnblogs.com/Lance1ot/p/8619267.html
Copyright © 2011-2022 走看看