UVa 10400 - Game Show Math 游戏中的数学 dfs+判重
题意:给出一些数字和一个目标数字,要求你在数字间添加+-*/,让表达式能达到目标数字,运算符号的优先级都是一样的。
由于数据量很大,本来想用map<string>判重的,结果还是超时了,然后发现彻底的把题意理解错了,我以为数字的位置可以变,还用了全排列,结果人家没说能变换顺序。。。
修改后还是超时了 = =。。。
果然map是行不通的,太耗时了,由于答案在[-32000,32000]之间,而你到达某一个位置的运算结果如果是以前以及算过的,后面的计算就算是重复的了,可以利用这个判重。
数据不是很大,不需要压缩直接开数组。
代码:
/*
* Author: illuz <iilluzen[at]gmail.com>
* Blog: http://blog.csdn.net/hcbbt
* File: uva10400.cpp
* Lauguage: C/C++
* Create Date: 2013-09-01 21:34:49
* Descripton: uva10400, dfs
*/
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
#define rep(i, n) for (int i = 0; i < (n); i++) const int MAXN = 101;
int a[MAXN], res, n;
bool flag, vis[MAXN][32000 * 2 + 1];
const string ept; bool ok(int a, int b) {
if (b >= -32000 && b <= 32000 && !vis[a][b + 32000]) {
vis[a][b + 32000] = true;
return true;
}
return false;
} void dfs(int d, int s, string t) {
if (flag) return;
if (d == n) {
if (s == res) {
flag = true;
rep(i, n - 1)
printf("%d%c", a[i], t[i]);
printf("%d=%d\n", a[n - 1], res);
}
return;
}
if (ok(d + 1, s + a[d + 1])) {
dfs(d + 1, s + a[d + 1], t + '+');
}
if (ok(d + 1, s - a[d + 1])) {
dfs(d + 1, s - a[d + 1], t + '-');
}
if (ok(d + 1, s * a[d + 1])) {
dfs(d + 1, s * a[d + 1], t + '*');
}
if (a[d + 1] && s % a[d + 1] == 0 && ok(d + 1, s / a[d + 1])) {
dfs(d + 1, s / a[d + 1], t + '/');
}
} int main() {
int t;
scanf("%d", &t);
while (t--) {
memset(vis, 0, sizeof(vis));
memset(a, 0, sizeof(a));
scanf("%d", &n);
rep(i, n) scanf("%d", &a[i]);
scanf("%d", &res);
flag = false;
dfs(0, a[0], ept);
if (flag == false) printf("NO EXPRESSION\n");
}
return 0;
}
UVa 10400 - Game Show Math 游戏中的数学 dfs+判重的更多相关文章
- UVA 10400 Game Show Math (dfs + 记忆化搜索)
Problem H Game Show Math Input: standard input Output: standard output Time Limit: 15 seconds A game ...
- UVa 10400 - Game Show Math
题目大意:给出n(n<100)个正整数和一个目标数,按照给出数的顺序,运用+.-.*./四则运算(不考虑优先级),判断能否得出所要的结果. 首先考虑的就是暴力枚举,不过时间复杂度为O(4n),会 ...
- slot游戏中的数学概念
最近研究slot 算法,看了大量的英文资料,因为母语中文,一直使用中文的英文小白来说,好心塞,悔不当初没学好英文. 下文是从众多的英文中摘录的唯一能够看明白的概念.先给自己留着,到时候深入研究可以看 ...
- Unity3D 2D游戏中寻径算法的一些解决思路
需求 unity3d的3d开发环境中,原生自带了Navigation的组件,可以很便捷快速的实现寻路功能.但是在原生的2d中并没有相同的功能. 现在国内很多手机游戏都有自动寻路的功能,或者游戏中存在一 ...
- lua脚本在游戏中的应用
为什么要在游戏中使用脚本语言? 要解释这个问题首先我们先来了解一下脚本语言的特性: 学习门槛低,快速上手 开发成本低,可维护性强 动态语言,灵活性高 相对于C/C++这类高复杂性.高风险的编译型语言来 ...
- js之翻牌游戏中的一个深刻感悟
先“上菜”: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...
- 地图四叉树一般用在GIS中,在游戏寻路中2D游戏中一般用2维数组就够了
地图四叉树一般用在GIS中,在游戏寻路中2D游戏中一般用2维数组就够了 四叉树对于区域查询,效率比较高. 原理图
- FPS中受伤UI在VR游戏中的实现思路
FPS中受伤UI在VR游戏中的实现思路 希望实现的效果 这几天一直在尝试各种解决方案,现在算是不完美的解决啦,记录一下心路历程,思路有了算法都比较简单. V_1 玩家胶囊体指向的方向作为正方向,计算出 ...
- Math类中的BigDecimal
如果我们编译运行下面这个程序会看到什么? public class Test { public static void main(String args[]) { ...
随机推荐
- JavaScript学习心得(八)
Cookie是Netscape发明的技术,是动态网站必不可少的部分,用于浏览器请求Web页面的超文本传输协议是一种无状态的协议. 两种方法维护状态:使用会话(session)(使用服务器技术实现,数据 ...
- mysql的数据类型int、bigint、smallint 和 tinyint取值范围 及varchar
使用整数数据的精确数字数据类型. bigint 从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据(所有数字 ...
- C# Winform开发框架企业版V4.0新特性
企业版V4.0 - 新特性 C/S系统开发框架-企业版 V4.0 (Enterprise Edition) 简介: http://www.csframework.com/cs-framework-4. ...
- python中的字典应用实例
字典中的键使用时必须满足一下两个条件: 1.每个键只能对应一个项,也就是说,一键对应多个值时不允许的(列表.元组和其他字典的容器对象除外).当有键发生冲突时(即字典键重复赋值),取最后的赋值. > ...
- iOS: 神奇的addSubView
看着addSubView, 本以为是添加多个对象, 但通过测试代码, 发现同一个对象在addSubView中只会添加一次. 想想, 视图对象是通过引用得到的. 在视图的子视图集中, 只保存一个相应的对 ...
- iOS: 学习笔记, Swift与Objective-C混用简明教程(转载)
Swift与Objective-C混用简明教程 转载自:https://github.com/lifedim/SwiftCasts/tree/master/000_mix_swift_objc 我想很 ...
- codeforces 361 C - Mike and Chocolate Thieves
Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Description Bad ...
- http知识累积
1. http头 Host, Host请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的. 如果有黑客劫持了用户的请求,篡改了Host的内容,当请求到 ...
- property测试代码:
// // main.m // TestVar2 // // Created by lishujun on 14-9-4. // Copyright (c) 2014年 lishujun. All r ...
- 转载:如何避免代码中的if嵌套
http://top.jobbole.com/4960/ http://stackoverflow.com/questions/24430504/how-to-avoid-if-chains 在Sta ...