码迷,mamicode.com
首页 > 其他好文 > 详细

UVA - 817 According to Bartjens 暴力

时间:2015-04-29 21:48:14      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:

题目大意:给出一个字符串,要求你在这个字符串里面加入符号,使得结果为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 judge(int num_s, int num_n) {

    vector<int> Num, Sign;

    for(int i = 0; i < num_s; i++)
        Sign.push_back(sign[i]);
    for(int i = 0; i < num_n; i++)
        Num.push_back(num[i]);
    for(int i = 0; i < Sign.size(); i++)
        if(Sign[i] == 1) {
            Num[i + 1] *= Num[i];
            Num.erase(Num.begin() + i);
            Sign.erase(Sign.begin() + i);
            i--;
        }

    int t = Num[0];
    for(int i = 0; i < Sign.size(); i++)
        if(Sign[i] == 2)
            t += Num[i + 1];
        else
            t -= Num[i + 1];
    return t == 2000;
}

void dfs(int cur, int cur_sign, int cur_num) {
    if(cur == len - 1) {
        if(judge(cur_sign, cur_num)) {
            flag = true;
            printf("  ");
            for(int i = 0; i < cur_num - 1; i++)
                printf("%d%c", num[i], s[sign[i]]);
            printf("%d=\n",num[cur_num - 1]);
        }
        return;
    }

    int t = 0;
    for(int i = cur ; i < len - 1; i++) {
        if(i == cur && str[i] == ‘0‘) {
            num[cur_num] = 0;
            if(i != len - 2) {
                for(int j = 1; j <= 3; j++) {
                    sign[cur_sign] = j;
                    dfs(i + 1, cur_sign+1, cur_num+1);
                }
            }
            else
                dfs(i + 1, cur_sign, cur_num + 1);
            break;
        }
        t = t * 10 + str[i] - ‘0‘;
        num[cur_num] = t;
        if(i != len - 2) {
            for(int j = 1; j <= 3; j++) {
                sign[cur_sign] = j;
                dfs(i + 1, cur_sign + 1, cur_num + 1);
            }
        }
        else {
            dfs(i + 1, cur_sign, cur_num + 1);
        }
    }
}

int main() {
    int cas = 1;
    while(scanf("%s", str) != EOF) {
        if(str[0] == ‘=‘)
            break;
        flag = false;
        len = strlen(str);
        printf("Problem %d\n", cas++);
        if(strcmp(str,"2000=") == 0) {
            printf("  IMPOSSIBLE\n");
            continue;
        }
        dfs(0,0,0);
        if(!flag)
            printf("  IMPOSSIBLE\n");
    }
    return 0;
}
#include<cstdio>
#include<iostream>
#include<stack>
#include<set>
#include<map>
#include<string>
#include<vector>
using namespace std;
const string sign[] = {"*","+","-",""};
map<char,int> Map;
set<string> Set;
bool judge(string s) {
    vector<int> num, sign;
    int cur = 0;
    while(1) {
        int t = 0;
        while(isdigit(s[cur]))
            t = t * 10 + s[cur++] - ‘0‘;
        num.push_back(t);
        if(s[cur] == ‘=‘)
            break;
        sign.push_back(Map[s[cur++]]);
    }

    for(int i = 0; i < sign.size(); i++) 
        if(sign[i] == 1) {
            num[i+1] *= num[i];
            sign.erase(sign.begin() + i);
            num.erase(num.begin() + i);
            i--;
        }
    int t = num[0];
    for(int i = 0; i < sign.size(); i++)
        if(sign[i] == 2)
            t += num[i + 1];
        else
            t -= num[i + 1];
    return t == 2000;
}

void dfs(string s, int pos, bool f) {
    if(pos == s.size() - 1) {
        if(judge(s))
            Set.insert(s);

        return;
    }

    for(int i = 0; i < 4; i++) {
        if(!f && i == 3)
            continue;
        string t = s;
        if(s[pos] != ‘0‘)
            dfs(t.insert(pos,sign[i]), i == 3? pos+1: pos+2, true);
        else
            dfs(t.insert(pos,sign[i]), i == 3? pos+1: pos+2, i == 3);
    }
}

int main() {
    int cas = 1;
    Map[‘*‘] = 1, Map[‘+‘] = 2, Map[‘-‘] = 3;
    string str;
    while(cin >> str) {
        if(str[0] == ‘=‘)
            break;
        Set.clear();
        printf("Problem %d\n", cas++);
        dfs(str,1,str[0] != ‘0‘);
        if(!Set.size() || str == "2000=") {
            printf("  IMPOSSIBLE\n");
            continue;
        }

        for(set<string>::iterator it = Set.begin(); it != Set.end(); it++)
            cout << "  " << *it << endl;
    }
    return 0;
}

UVA - 817 According to Bartjens 暴力

标签:

原文地址:http://blog.csdn.net/l123012013048/article/details/45370983

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!