uva 817(dfs)

题意:给出一个数字组成的字符串,然后在字符串内添加三种运算符号 * + - ,要求输出所有添加运算符并运算后结果等于2000的式子。

所有数字不能有前导0,且式子必须是合法的。

题解:字符串长度25左右,可以暴力,用dfs搜索所有可能的分割情况,并在每次分割的字符后添加三种运算符,然后递归到最后一个字符拿去判断,先用栈把所有分割字符串得到的数字压栈,同时优先运算’*’,然后再从左到右计算看结果是否为2000,注意2000=是IMPOSSIBLE。。。

#include <stdio.h>
#include <string.h>
#include <vector>
#include <stack>
using namespace std;
const int N = 30;
char str[N], s1[N], flag[3] = {‘*‘, ‘+‘, ‘-‘};
int res, len, s[N], pos[N];
vector<char> v[100];

bool judge(int num) {
    int cnt = 0, temp = 0, flag2 = 0;
    stack<int> sta;
    while (!sta.empty())
        sta.pop();
    for (int i = 0; i < len; i++) {
        temp = temp * 10 + s[i];
        if (i == pos[cnt]) {
            if (flag2) {
                int aa = sta.top();
                sta.pop();
                aa = aa * temp;
                sta.push(aa);
                if (s1[cnt] != ‘*‘)
                    flag2 = 0;
            }
            else if (s1[cnt] == ‘+‘ || s1[cnt] == ‘-‘)
                sta.push(temp);
            else if (s1[cnt] == ‘*‘) {
                sta.push(temp);
                flag2 = 1;
            }
            temp = 0;
            cnt++;
        }
    }
    if (flag2) {
        int aa = sta.top();
        sta.pop();
        aa = aa * temp;
        sta.push(aa);
    }
    else
        sta.push(temp);
    stack<int> sta2;
    while (!sta.empty()) {
        sta2.push(sta.top());
        sta.pop();
    }
    for (int i = 0; i < num; i++) {
        if (s1[i] != ‘*‘) {
            int aa = sta2.top();
            sta2.pop();
            int bb = sta2.top();
            sta2.pop();
            if (s1[i] == ‘-‘) {
                int cc = aa - bb;
                sta2.push(cc);
            }
            else {
                int cc = aa + bb;
                sta2.push(cc);
            }
        }
    }
    if (sta2.size() == 1 && sta2.top() == 2000)
        return true;
    return false;
}

void dfs(int cur, int num, int pre) {
    if (cur == len - 1) {
        if (judge(num)) {
            v[res].clear();
            int cnt = 0;
            for (int i = 0; i < len; i++) {
                v[res].push_back(str[i]);
                if (i == pos[cnt])
                    v[res].push_back(s1[cnt++]);
            }
            v[res].push_back(‘=‘);
            res++;
        }
        return;
    }
    pos[num] = cur;
    for (int i = 0; i < 3; i++) {
        s1[num] = flag[i];
        dfs(cur + 1, num + 1, cur);
    }
    pos[num] = -1;
    if (str[cur] == ‘0‘ && cur - pre == 1)
        return;
    dfs(cur + 1, num, pre);
}

int main() {
    int cas = 1;
    while (scanf("%s", str) && str[0] != ‘=‘) {
        memset(pos, -1, sizeof(pos));
        res = 0;
        len = strlen(str) - 1;
        for (int i = 0; i < len; i++)
            s[i] = str[i] - ‘0‘;
        printf("Problem %d\n", cas++);
        if (strcmp(str, "2000=") == 0) {
            printf("  IMPOSSIBLE\n");
            continue;
        }
        dfs(0, 0, -1);
        if (res == 0)
            printf("  IMPOSSIBLE\n");
        else {
            for (int i = 0; i < res; i++) {
                printf("  %c", v[i][0]);
                for (int j = 1; j < v[i].size(); j++)
                    printf("%c", v[i][j]);
                printf("\n");
            }
        }
    }
    return 0;
}
时间: 2024-10-05 20:48:51

uva 817(dfs)的相关文章

UVA - 817 According to Bartjens

Description  According to Bartjens  The wide dissemination of calculators and computers has itsdisadvantages. Even students in technical disciplinestend to exhibit a surprising lack of calculating ability. Accustomed tothe use of calculators and comp

UVa 817 According to Bartjens (暴力,DFS)

题意:给出一个数字组成的字符串,然后在字符串内添加三种运算符号 * + - ,要求输出所有添加运算符并运算后结果等于2000的式子. 所有数字不能有前导0, 且式子必须是合法的. 析:这个题很明显的暴力,因为最长才9位数字,也就是最多有8个位置位置可能插符号,当然实际并没有那么多,所以直接暴力就行,也不用优化,直接暴就行. 就是DFS,在每个位置考虑四种情况,*,+,-,或者不放,最后再一个一个的判断是不是等于2000就好,注意这个题有一个坑,我也不知道是哪个数据, 也没有想到,就是一个没有用运

uva 818(dfs+图+状态压缩)

题意:有n个环,编号从1到n,给出了一些环环相扣的情况,比如给a和b表示a和b两个环的扣在一起的,每个环都是可以打开的,问最少打开多少个环,然后再扣好,可以让所有的环成为一条链. 题解:状态压缩把所有的打开环的情况枚举出来,然后拿去判断是否成立,更新打开环后的图g[i][j],和每个点的度数,不成立有三种情况,1.计算没有打开的环的度数,如果大于2说明不会有链,2.把没有打开环拿去dfs,访问过就vis[i]++,如果vis[i]>=2说明存在环,3.如果打开的环数num + 1小于链的数量,说

UVA 11853 [dfs乱搞]

/* 大连热身E题 不要低头,不要放弃,不要气馁,不要慌张 题意: 在1000×1000的格子内有很多个炮弹中心,半径给定. 为某人能否从西部边界出发,从东部边界走出. 不能输出不能,能的话输出最北边的入口和出口的坐标. 思路: dfs乱搞题.把炮弹辐射范围连在一起的炮弹看作一个整体,记录下它围起来的边界区域. 然后找到最北边的输出. */ #include<bits/stdc++.h> using namespace std; double x[1005],y[1005],r[1005];

UVA Firetruck (DFS)

The Center City fire department collaborates with the transportation department to maintain maps of the city which reflects the current status of the city streets. On any given day, several streets are closed for repairs or construction. Firefighters

UVA 208 (DFS)

题意:找出1到T的所有路径: 坑点:一开始以为是到终点,读错了题意,没测试第二个样例,结果WA了4遍,坑大了: 1 #include <iostream> 2 #include <cmath> 3 #include <cstdio> 4 #include <cstring> 5 #include <cstdlib> 6 #include <sstream> 7 #include <algorithm> 8 #define

UVA - 817 According to Bartjens 暴力

题目大意:给出一个字符串,要求你在这个字符串里面加入符号,使得结果为2000 解题思路:直接暴力 #include<stdio.h> #include<string.h> #include<vector> #define maxn 30 using namespace std; char str[maxn]; bool flag; int num[maxn], sign[maxn], len; char s[5]= " *+-"; bool judg

uva 471(dfs)

题意:给出一个n,然后要得到所有的s1和s2满足,s1与s2都是位数不存在相等的数字,且s1 / s2 = n. 题解:纯暴力题,枚举s2,计算s1,然后判断s1和s2是否都是不重复数位的数字,终止条件是s1 > 9876543210. #include <stdio.h> long long n; int vis[10]; bool judge(long long x) { if (x > 9876543210) return false; for (int i = 0; i &

UVA 572 dfs求连通块

The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSurvComp works with one large rectangular region of land at a time, and creates a grid that divides the land into numerous square plots. It then analyze