UVA215 Spreadsheet
这道题题目大意就是计算带有单元格引用的各单元格的值。
这道题本身不难,有以下几个关键点:
1.如何判断一个单元格循环引用
2.注意对字符串的细致处理
我出现的错误出现在以上两个方面,思路本身是不难的。
第一条,我的错误在于第66行起初并没有加上。如果不加那一行,就代表了你同层之间不能是相同的单元格,但实际情况是逐层往下递归过程中出现重复才是真正的循环引用。
1到2到3到1属于循环引用,但假如去掉1,3连线,1随后会再访问一次,但此时我之前错误代码会认为出现循环引用,这实际上是两个相同单元格相加(A0+A0)
第二条,注意题目说的判断是单元格引用还是数值的方法很明白了,静下心来的仔细看,我的问题出在负数上。
#include <cstdio>
#include <cctype>
#include <iostream>
#include <set>
#include <map>
#include <climits>
using namespace std;
const int inv = INT_MIN;
string maps[][];
set<string> sheeps;
int strtoint(string s,int begin,int &end){
int i = begin;
int sum = ;
for(;isdigit(s[i]);i++){
sum = sum* + s[i] - '';
}
end=i;
return sum;
}
bool isdigits(const char * d){
int i=;
for(i;d[i];i++){
if(!isdigit(d[i]))return false;
}
return true;
}
int get_value(string str){
string s = maps[str[] - 'A'][str[] - ''];
if(!sheeps.count(str) ){
if(!isdigit(s[]))sheeps.insert(str);
}
else return inv;
int i=;
int sum = ;
char oper = '+';
while(i<s.size()){
if(!isdigit(s[i])&&(i||s[i]!='-')){//注意
if(s.substr(i,)=="in")return inv;
int v = get_value(s.substr(i,));
if(v == inv)return inv;
switch(oper){
case '+':sum+=v;break;
case '-':sum-=v;break;
}
i+=;
if(i>=s.size())break;
oper = s[i];
i++;
}
else {
if(s[i] == '-'){
i++;
if(oper == '+')oper = '-';
else oper = '+';
}
int v = strtoint(s,i,i);
switch(oper){
case '+':sum+=v;break;
case '-':sum-=v;break;
}
if(i>=s.size())break;
oper = s[i];
i++;
}
}
if(sheeps.count(str))sheeps.erase(str);
return sum;
} int main(){
int r,c;
while(cin >> r >> c && (r || c)){
for(int i=;i<r*c;i++){
cin >> maps[i/c][i%c];
}
map<string,string> invstr;
for(int i=;i<r*c;i++){
if(!isdigits(maps[i/c][i%c].c_str())){
sheeps.clear();
string str ;
str.push_back(i/c+'A');
str.push_back(i%c+'');
int v = get_value(str);
if(v==inv) {
invstr[str] = maps[i/c][i%c];
maps[i/c][i%c] = "in";
}
else maps[i/c][i%c] =to_string(v);
}
}
if(invstr.empty()){
putchar(' ');
for(int i=;i<c;i++)
printf("%6d",i);
putchar('\n');
for(int i=;i<r;i++){
putchar(i+'A');
for(int j=;j<c;j++){
printf("%6s",maps[i][j].c_str());
}
putchar('\n');
}
}
else{
for(auto it = invstr.begin();it!=invstr.end();it++){
cout << it->first <<": "<<it->second <<endl;
}
}
puts("");
}
return ;
}
UVA215 Spreadsheet的更多相关文章
- SharePoint 2010 Survey的Export to Spreadsheet功能怎么不见了?
背景信息: 最近用户报了一个问题,说他创建的Survey里将结果导出成Excel文件(Export to spreadsheet)的按钮不见了. 原因排查: 正常情况下,这个功能只存在于SharePo ...
- undefined reference to `Spreadsheet::staticMetaObject'
<C++ GUI Qt 4 编程>学习 一.遇到的问题 在学完第4章后,Spreasheet程序也已经写好了.在用 FindDialog 搜索时发现没有效果. 二.解决过程 调试跟踪代码, ...
- 电子表格控件Spreadsheet 对象方法事件详细介绍
1.ActiveCell:返回代表活动单元格的Range只读对象.2.ActiveSheet:返回代表活动工作表的WorkSheet只读对象.3.ActiveWindow:返回表示当前窗口的Windo ...
- kendoui treeview grid spreadsheet
treeview 傻子方式获取id <!DOCTYPE html> <html> <head> <title>API</title> < ...
- Spreadsheet Tracking
Spreadsheet Tracking Data in spreadsheets are stored in cells, which are organized in rows (r) and ...
- 关于OpenXml SpreadSheet列宽根据内容的Auto-suitability
因为之前接到的一个需求,让excel的宽度自动适应.所以最近一直在看Excel相关内容,从结构到.net的两个类库OpenXml和Office.Interop.Excel,再到一些具体的使 ...
- [C#]使用Gembox.SpreadSheet向Excel写入数据及图表
本文为原创文章.源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称.作者及网址,谢谢! 开发工具:VS2017 语言:C# DotNet版本:.Net FrameWork 4.0及以 ...
- Codeforces 777C Alyona and Spreadsheet
C. Alyona and Spreadsheet time limit per test:1 second memory limit per test:256 megabytes input:sta ...
- Uva - 512 - Spreadsheet Tracking
Data in spreadsheets are stored in cells, which are organized in rows (r) and columns (c). Some oper ...
随机推荐
- 构建vue零散笔记
# vue项目(用webpack构建)的前提是已安装了node.js,vue,vue-cli,webpack # 主要命令构建:vue init webpack 项目名(纯英文,且不可驼峰)运行:np ...
- android Service服务(二)
1.1 活动和服务进行通信 上一节中我们学习了启动和停止服务的方法.不知道你又没有发现,虽然服务是在活动里启动的,但在启动了服务之后,活动和服务基本上就没关系了,确实如此,我们在活动里调用了start ...
- Apache和Nignx基于三种方式搭建web站点并设置用户访问控制达到优化整个站点性能
个人用户主页: 1:Vim /etc/http/con.d/userdir: UserDir disabled //个人用户主页开启 UserDir public_html //指定 ...
- Python学习 :六个标准数据类型
一.Numbers(数字类型) 数字类型主要分为两种—— 整数(Integer)与 浮点数(Float) 整数分为整型和长整型(在Python3中已经不再区分为整型与长整型,统一称为整型) 注意:数字 ...
- Flask初学者:url_for
URL反转:反转是指通过视图函数名称得到其对应的URL(有反转也就有正转,即通过URL得到视图函数返回的内容,也就是我们平时的访问网页了),需要“url_for(endpoint, **values) ...
- ruby 数据类型Range
范围(Range)无处不在:a 到 z. 0 到 9.等等.Ruby 支持范围,并允许我们以不同的方式使用范围: 作为序列的范围 作为条件的范围 作为间隔的范围 作为序列的范围 (1..5) #==& ...
- mtools使用-1
mtools是什么? mtools 是一组非常好用的 MongoDB 日志分析工具 ,由MongoDB Inc 官方工程师所写. 组成部分 mlogfilter :按时间切片日志文件,合并日志文件,过 ...
- javascript 之 为函数设置默认参数值
方法一: function example(a,b){ var a = arguments[0] ? arguments[0] : 1;//设置参数a默认为1 var b = arguments[1] ...
- 在WPF中自定义控件(2) UserControl
原文:在WPF中自定义控件(2) UserControl 在WPF中自定义控件(2) UserControl ...
- Hibernate-ORM:15.Hibernate中的Criteria查询
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客讲师Hibernate中的Criteria查询! 一,Criteria简介: 刚接触Hibernate ...