dfs全排列  加  模拟计算

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#define maxn 10010
using namespace std; bool vis[10];
int value[10], result, n, now[10],top;
char expr[100];
int check(int l, int r)
{
if(l > r)
return 0;
int cnt = 0,p = -1,flag = 0;
for(int i = l; i <= r; i++)
if(expr[i] == '(')
++cnt;
else if(expr[i] == ')')
--cnt;
else if((expr[i] == '+' || expr[i] == '-') && !cnt)
flag = 1, p = i;
else if((expr[i] == '*') && !cnt && !flag)
p = i;
if( p == -1 )
{
if( l == r )
{
return now[top++];
}
return check(l+1, r-1);
}
switch(expr[p])
{
case '+':
return check(l,p-1) + check(p+1,r);
case '-':
return check(l,p-1) - check(p+1,r);
case '*':
return check(l,p-1) * check(p+1,r);
}
return 0;
}
int dfs(int cur)
{
if( cur == n )
{
top = 0;
int len = strlen(expr);
if(check(0, len-1) == result)
return 1;
// printf("%d\n",check(0,len-1));
}
for(int i = 0; i < n; i++)
{
if( !vis[i] )
{
vis[i] = true;
now[cur] = value[i];
if(dfs(cur+1))
return 1;
vis[i] = false;
}
}
return 0;
}
int main()
{
while( scanf("%d",&n) == 1 )
{
if(n == 0)
{
scanf("%d",&result);
if(result == 0)
break;
}
for(int i = 0; i < n; i++) scanf("%d",&value[i]);
scanf("%d",&result);
scanf("%s",expr);
int flag = 0;
for(int i = 0; i < n; i++)
{
memset(vis, false, sizeof(vis));
vis[i] = true;
now[0] = value[i];
if(dfs(1))
{
flag = 1;
break;
}
vis[i] = false;
}
if( flag ) puts("YES");
else puts("NO");
}
return 0;
}

使用stl中的全排列函数

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#define maxn 10010
using namespace std; int value[10], result, n, top;
char expr[100];
int check(int l, int r)
{
if(l == r)
return value[top++];
int cnt = 0,p = -1,flag = 0;
for(int i = l; i <= r; i++)
if(expr[i] == '(') cnt++;
else if(expr[i] == ')') cnt--;
else if((expr[i] == '+' || expr[i] == '-') && !cnt) flag = 1, p = i;
else if((expr[i] == '*') && !cnt && !flag) p = i;
if( p == -1 )
return check(l+1, r-1);
switch(expr[p])
{
case '+':
return check(l,p-1) + check(p+1,r);
case '-':
return check(l,p-1) - check(p+1,r);
case '*':
return check(l,p-1) * check(p+1,r);
}
return 0;
} int main()
{
while( scanf("%d",&n) == 1 )
{
if(n == 0)
{
scanf("%d",&result);
if(result == 0)
break;
}
for(int i = 0; i < n; i++) scanf("%d",&value[i]);
scanf("%d",&result);
scanf("%s",expr);
int flag = 0;
int len = strlen(expr);
sort(value, value+n);
do
{
top = 0;
if(check(0, len-1) == result)
{
flag = 1;
break;
}
}while(next_permutation(value, value+n));
if( flag ) puts("YES");
else puts("NO");
}
return 0;
}

hdu 4192的更多相关文章

  1. hdu 4192 (表达式求值)

    <题目链接> <转载于 >>>  > 题目大意: 给你n个数,和一个最终的结果,再给你一个含有n个不同变量的式子,问你这个式子最终能否得到指定的答案. 解题分 ...

  2. UVALive 4192/HDU 2959 Close Enough Computations 数学

    Close Enough Computations Problem Description The nutritional food label has become ubiquitous. A sa ...

  3. hdu 4193 Non-negative Partial Sums 单调队列。

    Non-negative Partial Sums Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav ...

  4. HDOJ 2111. Saving HDU 贪心 结构体排序

    Saving HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  5. 【HDU 3037】Saving Beans Lucas定理模板

    http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...

  6. hdu 4859 海岸线 Bestcoder Round 1

    http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...

  7. HDU 4569 Special equations(取模)

    Special equations Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  8. HDU 4006The kth great number(K大数 +小顶堆)

    The kth great number Time Limit:1000MS     Memory Limit:65768KB     64bit IO Format:%I64d & %I64 ...

  9. HDU 1796How many integers can you find(容斥原理)

    How many integers can you find Time Limit:5000MS     Memory Limit:32768KB     64bit IO Format:%I64d ...

随机推荐

  1. 选用 get 与 post 的一些建议

    1.http的请求方法:get  post 2. get:会把请求的内容  放到链接地址里面(数据请求的时候  默认的是get请求) 例:www.baidu.com/user/login?userna ...

  2. log4j定义某个类的日志级别

    项目引入了定时任务后,当我把已有的定时任务删除后,控制台一直会打出类似于 [org.springframework.scheduling.quartz.LocalDataSourceJobStore] ...

  3. COM 学习小记录

    COM组件程序:模块,它可以是 动态连接库(DLL) && 可执行程序(EXE),称为 进程内组件(in-of-process component) && 进程外组件( ...

  4. Unity编程回忆录之控制物体移动

    最新心血来潮,然后开始学习Unity3D游戏开发引擎,对于一个主流的跨平台3D游戏开发引擎,我已经深深的为他着迷了,于是果断的开始学习这个引擎,而且刚刚预装的游戏引擎最新版中4.3版本已经开始原生支持 ...

  5. Java多线程(二) 多线程的锁机制

    当两条线程同时访问一个类的时候,可能会带来一些问题.并发线程重入可能会带来内存泄漏.程序不可控等等.不管是线程间的通讯还是线程共享数据都需要使用Java的锁机制控制并发代码产生的问题.本篇总结主要著名 ...

  6. Centos7下安装netstat

    刚安装centos7发想没有查看端口的命令 netstat yum install net-tools

  7. spring 计划任务:cron表达式

    Cron表达式是一个字符串,字符串以5或6个空格隔开,分开工6或7个域,每一个域代表一个含义,Cron有如下两种语法 格式: Seconds Minutes Hours DayofMonth Mont ...

  8. 【转】sqlserver查询数据库中有多少个表

    sql server 数表: select count(1) from sysobjects where xtype='U' 数视图: select count(1) from sysobjects ...

  9. 如何使用Git——(二)

    8.首次安装git,然后要把创建好的仓库放到github上,首先,你要先做一些基本设置,继续设置吧~~. 在git黑框框中输入  ssh-keygen -t rsa -C "your ema ...

  10. delphi 仅带下划线的TEdit控件

    在做录入框的时候,很希望有一个只带下划线的文本框,网上介绍的很多,有自己做组件的,须不知Delphi下只需要简单设置几个属性即可达到目的.