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 ...
随机推荐
- python之ProcessPoolExecutor
ProcessPoolExecutor使用上基本与ThreadPoolExecutor一致不过在windows上使用,有个问题需要注意.使用不当会出现如下错误 File "...\lib\m ...
- 修改状态栏,电池,wifi的颜色为白色
修改状态栏,电池,wifi的颜色为白色 在info里面设置View controller-based status bar appearance,为no
- npm ERR! code ENOENT (未找到文件 error no entry)
问题: ENOENT一般是没找到文件或路径,包括因为权限问题没找到的情况 解决: 我这个是 目录选择错了 其他:
- 牛客小白月赛2 I 艺 【归并思想】【离散化】
链接:https://www.nowcoder.com/acm/contest/86/I来源:牛客网 题目描述 接下去,Sεlιнα(Selina) 又搞了个文艺竞演. 虽说是文艺竞演,其实只是为了满 ...
- MySQL字段的属性应该尽量设置为NOT NULL
数据库建表时,对于一些可填可不填的字段,我们应该尽量把它设置为 NOT NULL.这种做法即可以提高性能,又可以在很大程度上避免空指针类的问题,好处颇多. 1.节省空间 NULL 列需要更多的存储空间 ...
- python核心编程2 第十五章 练习
15-1.识别下列字符串 :“bat ”.“bit ”.“but ”.“hat ”.“hit” 或 “hut ” import re from random import choice strtupl ...
- 如何在linux系统内用openssl 生成 过期的证书
需求:验证过期的证书在系统中不能使用. 问题:如何生成过期的证书呢? 解决方法:1.调整系统时间 2.生成证书 3.验证证书startdate 和 enddate 是否符合你的预期 1.调整系统时间 ...
- Linux分享笔记:系统状态检测命令小结
作为一名合格的运维人员,要能很好地了解Linux服务器,要能熟练查看Linux系统的运行状态.以下是常用到的Linux系统状态检测命令. 1. ifconfig:用于获取网卡配置与网络状态等信息.通常 ...
- 前端javaScript经典面试题
1.alert(1&&2),alert(1||0) alert(1&&2)的结果是2 只要“&&”前面是false,无论“&&”后面是t ...
- Spring IoC的底层技术支持——Java反射机制
我们知道,通过 new XmlClassPathApplicationContext("beans.xml")等方式即可启动容器.在容器启动时,Spring 根据配置文件的描述信息 ...