codeforces100861J——Jig-saw Puzzle

来源:互联网 发布:冒险小虎队知乎 编辑:程序博客网 时间:2024/05/21 19:03

1、题意:给你一个罗马数字版的等式,让你移动一根火柴使得式子成立。
2、分析:既然是移动一根火柴,那么我们就暴力枚举在哪里修改过添加删除之类的就好(处理的时候可以将字符串中间先都填上空格,最后求等号两边的式子值的时候再去掉),判断罗马数字的话我们可以用一个map存下来每一个罗马数字对应什么数,然后有没有去map里面查找就可以了。具体的可以看看代码

#include <set>#include <map>#include <queue>#include <cmath>#include <vector>#include <bitset>#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define M 1000010#define LL long long#define MOD 1000000007#define inf 2147483647#define llinf 4000000000000000000ll#define For(i, x, y) for(int i = (x); i < (y); i ++)#define rep(i, x, y) for(int i = (x); i <= (y); i ++)#define drep(i, x, y) for(int i = (x); i >= (y); i --)inline int read(){    char ch = getchar(); int x = 0, f = 1;    while(ch < '0' || ch > '9'){        if(ch == '-') f = -1;        ch = getchar();    }    while('0' <= ch && ch <= '9'){        x = x * 10 + ch - '0';        ch = getchar();    }    return x * f;}map<string , int> mp;string ch[110];struct Change{    char a, b;} rl[20];#define rlsize 8inline void init(){    string fd[10] = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};    string sd[10] = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};    For(i, 1, 100){        mp.insert(make_pair(sd[i / 10] + fd[i % 10], i));        ch[i] = sd[i / 10] + fd[i % 10];    }    rl[0] = (Change){'I', ' '};    rl[1] = (Change){'-', ' '};    rl[2] = (Change){'=', '-'};    rl[3] = (Change){'L', 'I'};    rl[4] = (Change){'+', '-'};    rl[5] = (Change){'+', 'I'};    rl[6] = (Change){'X', '/'};    rl[7] = (Change){'V', '/'};    rl[8] = (Change){' ', 'I'};    rl[9] = (Change){' ', '-'};    rl[10] = (Change){'-', '='};    rl[11] = (Change){'I', 'L'};    rl[12] = (Change){'-', '+'};    rl[13] = (Change){'I', '+'};    rl[14] = (Change){'/', 'X'};    rl[15] = (Change){'/', 'V'};}set<string> res;inline string del_zero(string s){    string ret = "";    For(i, 0, s.size()){        if(s[i] != ' ') ret += s[i];    }    return ret;}inline string Move(string s, int i, int j, Change x, Change y){    if(i == j) s[i] = y.b;    else s[i] = x.b, s[j] = y.b;    s = del_zero(s);    return s;}inline bool can_Move(string s, int i, int j, Change x, Change y){    if(i == j){        if(s[i] != x.a) return false;        if(x.b != y.a) return false;        if(y.b == x.a) return false;        s[i] = y.b;    }    else{        if(s[i] != x.a) return false;        if(s[j] != y.a) return false;        if(x.b == '/') return false;        if(y.b == '/') return false;        s[i] = x.b;        s[j] = y.b;    }    s = del_zero(s);    int cnt = 0;    For(i, 0, s.size()){        if(s[i] == '=') cnt ++;    }    if(cnt != 1) return false;//  cout << s.size() << "";    string now = "";    For(i, 0, s.size()){        if(s[i] == '+' || s[i] == '-' || s[i] == '='){        //  cout << now << endl;            if(mp.find(now) == mp.end()) return false;            now = "";        }        else now += s[i];    //  cout << now << endl << now.size() << endl;    }    if(mp.find(now) == mp.end()) return false;    return true;}inline int getnum(string s){    string now = ""; int ret = 0, fx = 1;    For(i, 0, s.size()){        if(s[i] == '+'){            ret += mp[now] * fx;            now = ""; fx = 1;        }        else if(s[i] == '-'){            ret += mp[now] * fx;            now = ""; fx = -1;        }        else{            now += s[i];        }    }    ret += mp[now] * fx;    return ret;}inline bool is_equal(string s, int i, int j, Change x, Change y){    s = Move(s, i, j, x, y);    int pos;    For(i, 0, s.size()){        if(s[i] == '=') pos = i;    }    string str1 = "", str2 = "";    For(i, 0, pos) str1 += s[i];    For(i, pos + 1, s.size()) str2 += s[i];    return getnum(str1) == getnum(str2);}int main(){    //freopen("0input.in", "r", stdin);    string s;    cin >> s;    init();    string ns = "";    For(i, 0, s.size()){        ns += " ";        ns = ns + s[i];    }    s = ns + ' ';    //printf("%d\n", s.size());    For(i, 0, s.size()) For(j, 0, s.size()) For(w, 0, rlsize) For(k, rlsize, 2*rlsize){        //printf("%d %d %d %d\n", i, j, w, k);        if(!can_Move(s, i, j, rl[w], rl[k])) continue;        if(is_equal(s, i, j, rl[w], rl[k])) res.insert(Move(s, i, j, rl[w], rl[k]));    }    for(set<string> :: iterator it = res.begin(); it != res.end(); it ++){        cout << *it << endl;    }    return 0;}
0 0
原创粉丝点击