题目链接:

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的更多相关文章

  1. Project Euler 89:Roman numerals 罗马数字

    Roman numerals For a number written in Roman numerals to be considered valid there are basic rules w ...

  2. UVA 185(暴力DFS)

      Roman Numerals  The original system of writing numbers used by the early Romans was simple but cum ...

  3. Roman numerals

    Roman numerals 罗马数字的题目, 注意几个关键的数字即可: (100, 400, 500, 900) -> ('C', 'CD', 'D', 'CM'); (10, 40, 50, ...

  4. 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 ...

  5. CodeForcesGym 100641D Generalized Roman Numerals

    Generalized Roman Numerals Time Limit: 5000ms Memory Limit: 262144KB This problem will be judged on  ...

  6. Roman Numerals All In One

    Roman Numerals All In One 罗马数字 refs https://www.mathsisfun.com/roman-numerals.html https://www.maths ...

  7. UVa 130 - Roman Roulette

    模拟约瑟夫环  Roman Roulette  The historian Flavius Josephus relates how, in the Romano-Jewish conflict  o ...

  8. UVA题目分类

    题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics ...

  9. [LeetCode] Roman to Integer 罗马数字转化成整数

    Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 t ...

随机推荐

  1. K8s 终将废弃 docker,TKE 早已支持 containerd

    近日 K8s 官方称最早将在 1.23版本弃用 docker 作为容器运行时,并在博客中强调可以使用如 containerd 等 CRI 运行时来代替 docker.本文会做详细解读,并介绍 dock ...

  2. Docker部署Mysql8.0.20并配置主从复制

    1. Linux安装Mysql8.0.20并配置主从复制(一主一从,双主双从)   Linux安装Mysql8.0.20并配置主从复制(一主一从,双主双从) 2. 前提准备 # 创建主从数据库文件夹 ...

  3. PHP代码审计学习-PHP-Audit-Labs-day2

    filter_var()函数 filter_var() 函数通过指定的过滤器过滤一个变量.如果成功,则返回被过滤的数据.如果失败,则返回 FALSE. filter_var(variable, fil ...

  4. 总结 Visual Studio 2019 发布以来 XAML 工具的改进

    不知不觉,Visual Studio 2019 已经出到 16.8 和 16.9 Preview 了.虽然每次更新都林林总总地一大堆新功能和改进,但关于 XAML 的内容总是,always,每次都只有 ...

  5. node目录

    1 [了解nodejs] 1.1 [node简介] 1.2 [node的特点] 1.3 [如何安装] 1.4 [如何运行] 2 [es6--基本语法] 2.1 [变量的解构赋值] 2.2 [解构赋值] ...

  6. MyBatisPlus-常用注解

    一.@TableName 映射数据库的表名 package com.md.entity; import com.baomidou.mybatisplus.annotation.*; import co ...

  7. python的常用内建模块与常用第三方模块

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 一.常用内置模块1.datetimePython 提供了一个 time 和 calendar 模块可 ...

  8. python 做回归

    1 一元线性回归 线性回归是一种简单的模型,但受到广泛应用,比如预测商品价格,成本评估等,都可以用一元线性模型.y = f(x) 叫做一元函数,回归意思就是根据已知数据复原某些值,线性回归(regre ...

  9. 论文阅读: A Review of Robot Learning for Manipulation: Challenges, Representations, and Algorithms

    机器人学习操纵综述:挑战,表示形式和算法 1.介绍 因此,研究人员专注于机器人应如何学习操纵周围世界的问题. 这项研究的范围很广,从学习个人操作技巧到人类演示,再到学习适用于高级计划的操作任务的抽象描 ...

  10. sql优化的几种方式

    一.为什么要对SQL进行优化 我们开发项目上线初期,由于业务数据量相对较少,一些SQL的执行效率对程序运行效率的影响不太明显,而开发和运维人员也无法判断SQL对程序的运行效率有多大,故很少针对SQL进 ...