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语言验证码识别,以后不用老输入验证码了。
1.Python 3.6 安装包 1.要加环境变量 2.pip安装PIL库 3.pip安装pytesseract模块 2.tesseract-ocr-setup-4.00.00dev.exe -- ...
- javascript跳转页面
<script type="text/javascript"> function openNewTab() { parent.addExampleTab({ id: a ...
- iOS之报错“Cannot create __weak reference in file using manual reference counting”解决办法
解决的办法:在Build Settings--------->Aplle LLVM8.0 - Language - Objectibe-C------------->Weak Refere ...
- iOS之UIImagePickerController显示中文界面
iOS开发中,我们经常遇到获取拍照.相册中图片的功能,就必然少不了UIImagePickerController,但是我们发现当我们使用它的时候,它的页面是英文的,看着很别扭,国人还是比较喜欢看中文界 ...
- Javascript中的内存泄漏
最新博客站点:欢迎来访 一.内存泄漏 由于某些原因不再需要的内存没有被操作系统或则空闲内存池回收.编程语言中有多种管理内存的方式.这些方式从不同程度上会减少内存泄漏的几率,高级语言嵌入了 ...
- Cacti 学习笔记
Cacti是用php语言实现的一个软件,它的主要功能是用snmp服务获取数据,然后用rrdtool储存和更新数据,当用户需要查看数据的时候用rrdtool生成图表呈现给用户.因此,snmp和rrdto ...
- 【ospf-路由聚合】
- sencha inspector(调试工具)
Sencha Inspector 一:安装sencha inspector 使用Sencha Inspector下载Ext JS试用版(可在此处获得). 下载后,双击下载的文件以启动安装程序,然后按照 ...
- Python学习:2.Python集成学习环境(IDE)Pycharm的安装配置以及激活方
一.下载Pycharm Pycharm作为Python现在最流行的集成开发环境,我们今后的Python的学习也就使用Pycharm进行,那今天我们就讲一下Pycharm的安装配置以及激活 1.我们首先 ...
- CAS解扰小结
1.每个ts数据包由:1.包头 2.包数据 包头有个字段 PID ,该字段指示包数据的类型.比如说: PID 为 0x0000 包数据的类型就是 PAT表 PID 为 0x0001 包数据的类型就是 ...