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
- codeforces100861J——Jig-saw Puzzle
- UVa227——Puzzle
- 227—puzzle
- zoj1602——Multiplication Puzzle
- POJ3678——Katu Puzzle
- POJ1651——Multiplication Puzzle
- A hard puzzle—1097
- csu1006:SAW
- hdu 1098——Ignatius's puzzle
- hdu 2514—— Another Eight Puzzle
- poj 1651——Multiplication Puzzle
- Problem 015 —— UVa 227 Puzzle
- UVa227 Puzzle——C++版本
- UVa Puzzle——C语言版本
- POJ 1651 —— Multiplication Puzzle
- AOJ0121——Seven Puzzle(BFS)
- 动态规划——Multiplication Puzzle
- puzzle
- Ubuntu KyLin 14.04如何通过Firefox安装Flash插件
- Unity&Shader基础篇-绘制网格+圆盘
- java知识
- 漫谈高并发架构
- 报表设置 jeecg 动态在线报表
- codeforces100861J——Jig-saw Puzzle
- 解决npm run typings install无法下载typings文件问题
- 1002. A+B for Polynomials
- linux内核Kmalloc分配内存需要注意的问题(GFP_KERNEL可能会造成内核调度错误)
- 《大话数据结构》
- C#中重写(override)和覆盖(new)的区别
- Message Flood
- 触发器
- 实施微服务,我们需要哪些基础框架http://www.open-open.com/news/view/b7463e