UVA - 185 Roman Numerals
题目链接:
https://vjudge.net/problem/UVA-185
思路:
剪枝、回溯
注意回溯的时候,是从当前点的下一个开始,而不是从已经遍历的个数点开始!!不然回溯有问题!
思路参考自https://blog.csdn.net/HelloWorld10086/article/details/38778361
1 #include <iostream>
2 #include<cstdio>
3 #include<map>
4 #include<set>
5 #include<cstring>
6 #include<string>
7 using namespace std;
8 map<char,int> mp,mp2;
9 string s1,s2,sum;
10 int vis[2000];
11 int size,count=0;
12 const char letter[]="IXCMVLD";
13 int head[2000];
14
15 int change(string number){
16 int ans=mp[number[number.size()-1]];
17 for(int i=number.size()-2;i>=0;i--){
18 if(mp[number[i]]<mp[number[i+1]])
19 ans-=mp[number[i]];
20 else
21 ans+=mp[number[i]];
22 }
23 return ans;
24 }
25 int judge2(string a,string b,string c){
26 int num1,num2,ans;
27 int tmp=1;
28 for(int i=a.size()-1;i>=0;i--){
29 num1+=mp2[a[i]]*tmp;
30 tmp*=10;
31 }
32 }
33 int trans(string s){
34 int tmp=1,ans=0;
35 for(int i=s.size()-1;i>=0;i--){
36 ans+=tmp*mp2[s[i]];
37 tmp*=10;
38 }
39 return ans;
40 }
41 void dfs(int cur,int cnt){
42 if(cnt==size){
43 if(trans(s1)+trans(s2)==trans(sum)) {
44 count++;
45 }
46 return;
47 }
48 if(count>1) return;
49 for(int i=cur;i<7;i++){
50 if(vis[letter[i]]){
51 for(int j=0;j<=9;j++){
52 if(!vis[j]){//letter[i]<-j
53
54 if(j==0&&head[letter[i]])
55 continue;
56
57 vis[j]=1;
58
59 mp2[letter[i]]=j;//想象成一个数组,不用再回溯
60
61 // dfs(cur+1,cnt+1);
62 dfs(i+1,cnt+1);//不是下一位,不然回溯有问题!!
63
64 vis[j]=0;
65
66 if(count>1)
67 return;
68 }
69 }
70 }
71 }
72 }
73 void init(){
74 mp2.clear();
75 memset(vis,0,sizeof(vis));
76 memset(head,0,sizeof(head));
77 size=0;count=0;
78
79 mp['I']=1;mp['X']=10;mp['C']=100;mp['M']=1000;
80 mp['V']=5;mp['L']=50;mp['D']=500;
81 }
82 int main(int argc, char** argv) {
83 string line;
84 while(cin>>line){
85 if(line[0]=='#') break;
86 init();
87
88 int ind1,ind2;
89 for(int i=0;i<line.size();i++){
90 if(line[i]=='+') {
91 ind1=i;
92 s1=line.substr(0,ind1);
93 }
94 else if(line[i]=='='){
95 ind2=i;
96 s2=line.substr(ind1+1,ind2-ind1-1);
97 }
98 else if(!vis[line[i]]){
99 vis[line[i]]=1;
100 size++;
101 }
102 }
103 sum=line.substr(ind2+1);
104
105 head[s1[0]]=1;head[s2[0]]=1;head[sum[0]]=1;
106
107 if(change(s1)+change(s2)==change(sum)){
108 printf("Correct ");
109 }else{
110 printf("Incorrect ");
111 }
112 dfs(0,0);
113 if(count>1) printf("ambiguous\n");
114 else if(count==1) printf("valid\n");
115 else printf("impossible\n");
116
117 }
118 return 0;
119 }
UVA - 185 Roman Numerals的更多相关文章
- Project Euler 89:Roman numerals 罗马数字
Roman numerals For a number written in Roman numerals to be considered valid there are basic rules w ...
- UVA 185(暴力DFS)
Roman Numerals The original system of writing numbers used by the early Romans was simple but cum ...
- Roman numerals
Roman numerals 罗马数字的题目, 注意几个关键的数字即可: (100, 400, 500, 900) -> ('C', 'CD', 'D', 'CM'); (10, 40, 50, ...
- Project Euler:Problem 89 Roman numerals
For a number written in Roman numerals to be considered valid there are basic rules which must be fo ...
- CodeForcesGym 100641D Generalized Roman Numerals
Generalized Roman Numerals Time Limit: 5000ms Memory Limit: 262144KB This problem will be judged on ...
- Roman Numerals All In One
Roman Numerals All In One 罗马数字 refs https://www.mathsisfun.com/roman-numerals.html https://www.maths ...
- UVa 130 - Roman Roulette
模拟约瑟夫环 Roman Roulette The historian Flavius Josephus relates how, in the Romano-Jewish conflict o ...
- UVA题目分类
题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics ...
- [LeetCode] Roman to Integer 罗马数字转化成整数
Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 t ...
随机推荐
- AOP基本概念
连接点joinpoint(类中所有方法) 切入点pointcut(缺少共性代码的方法) 通知advice(被抽取的共性功能的代码逻辑,通知有位置区分,也就是从切入点方法中被抽取代码的前面还是后面抽象出 ...
- Vue 组件化开发的思想体现
现实中的组件化思想化思想体现 标准(同一的标准) 分治(多人同时开发) 重用(重复利用) 组合(可以组合使用) 编程中的组件化思想 组件化规范:Web Components 我们希望尽可能多的重用代码 ...
- PHPCMS V9.6.0 SQL注入漏洞EXP
运行于python3.5 import requests import time import re import sys def banner(): msg = '''--------------E ...
- codeforces 1443D,解法简单,思维缜密的动态规划问题
大家好,欢迎来到codeforces专题. 今天选择的问题是1443场次的D题,这题是全场倒数第三题,截止到现在一共通过了2800余人.这题的思路不算难,但是思考过程非常有趣,这也是这一期选择它的原因 ...
- RHCE <复习RHSCA>
什么是shell? shell是你(用户)和Linux(或者更准确的说,是你和Linux内核)之间的接口程序,你在提示符下输入的每个命令都由shell先解释然后传给Linux内核. bash 是大多数 ...
- 网络 IO 工作机制
ref: 深入分析 java web 技术内幕 2.3 两台计算机之间进行数据的传输需要经过很多步骤.首先有相互沟通的意向,然后还要有沟通的通道:通过电话还是面对面交流(物理链路).最后,两个人说话的 ...
- sql去除重复的几种方法
所以用这样一句SQL就可以去掉重复项了: select * from msg group by terminal_id; SQL中distinct的用法(四种示例分析) 示例1 select dist ...
- Spring boot 启动错误处理:Action: Consider the following: If you want an embedded database (H2, HSQL or Derby), please put it on the classpath. If you have database settings to be loaded from a particular...
错误原因 在pom中引入了mybatis-spring-boot-starter ,Spring boot默认会加载org.springframework.boot.autoconfigure.jdb ...
- mapboxgl实现带箭头轨迹线
最近在使用mapboxgl实现轨迹展示时,想实现类似高德地图导航轨迹效果,然而并未在网上找到类似示例.经一番研究与尝试,最终解决,效果如下. 添加箭头核心代码如下,只需在配置layout中添加symb ...
- count(*) 优化
几种获取记录数的方法 count(*): MySQL 优化过,扫描的行数小于总记录数.执行效率高. count(1): 遍历所有记录,不取值,对每行尝试添加一个 "1" 列,如果不 ...