这道题题目大意就是计算带有单元格引用的各单元格的值。

这道题本身不难,有以下几个关键点:

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

  1. SharePoint 2010 Survey的Export to Spreadsheet功能怎么不见了?

    背景信息: 最近用户报了一个问题,说他创建的Survey里将结果导出成Excel文件(Export to spreadsheet)的按钮不见了. 原因排查: 正常情况下,这个功能只存在于SharePo ...

  2. undefined reference to `Spreadsheet::staticMetaObject'

    <C++ GUI Qt 4 编程>学习 一.遇到的问题 在学完第4章后,Spreasheet程序也已经写好了.在用 FindDialog 搜索时发现没有效果. 二.解决过程 调试跟踪代码, ...

  3. 电子表格控件Spreadsheet 对象方法事件详细介绍

    1.ActiveCell:返回代表活动单元格的Range只读对象.2.ActiveSheet:返回代表活动工作表的WorkSheet只读对象.3.ActiveWindow:返回表示当前窗口的Windo ...

  4. kendoui treeview grid spreadsheet

    treeview 傻子方式获取id <!DOCTYPE html> <html> <head> <title>API</title> < ...

  5. Spreadsheet Tracking

     Spreadsheet Tracking  Data in spreadsheets are stored in cells, which are organized in rows (r) and ...

  6. 关于OpenXml SpreadSheet列宽根据内容的Auto-suitability

          因为之前接到的一个需求,让excel的宽度自动适应.所以最近一直在看Excel相关内容,从结构到.net的两个类库OpenXml和Office.Interop.Excel,再到一些具体的使 ...

  7. [C#]使用Gembox.SpreadSheet向Excel写入数据及图表

    本文为原创文章.源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称.作者及网址,谢谢! 开发工具:VS2017 语言:C# DotNet版本:.Net FrameWork 4.0及以 ...

  8. Codeforces 777C Alyona and Spreadsheet

    C. Alyona and Spreadsheet time limit per test:1 second memory limit per test:256 megabytes input:sta ...

  9. Uva - 512 - Spreadsheet Tracking

    Data in spreadsheets are stored in cells, which are organized in rows (r) and columns (c). Some oper ...

随机推荐

  1. python语言验证码识别,以后不用老输入验证码了。

    1.Python 3.6 安装包 1.要加环境变量 2.pip安装PIL库 3.pip安装pytesseract模块 2.tesseract-ocr-setup-4.00.00dev.exe   -- ...

  2. javascript跳转页面

    <script type="text/javascript"> function openNewTab() { parent.addExampleTab({ id: a ...

  3. iOS之报错“Cannot create __weak reference in file using manual reference counting”解决办法

    解决的办法:在Build Settings--------->Aplle LLVM8.0 - Language - Objectibe-C------------->Weak Refere ...

  4. iOS之UIImagePickerController显示中文界面

    iOS开发中,我们经常遇到获取拍照.相册中图片的功能,就必然少不了UIImagePickerController,但是我们发现当我们使用它的时候,它的页面是英文的,看着很别扭,国人还是比较喜欢看中文界 ...

  5. Javascript中的内存泄漏

    最新博客站点:欢迎来访 一.内存泄漏        由于某些原因不再需要的内存没有被操作系统或则空闲内存池回收.编程语言中有多种管理内存的方式.这些方式从不同程度上会减少内存泄漏的几率,高级语言嵌入了 ...

  6. Cacti 学习笔记

    Cacti是用php语言实现的一个软件,它的主要功能是用snmp服务获取数据,然后用rrdtool储存和更新数据,当用户需要查看数据的时候用rrdtool生成图表呈现给用户.因此,snmp和rrdto ...

  7. 【ospf-路由聚合】

  8. sencha inspector(调试工具)

    Sencha Inspector 一:安装sencha inspector 使用Sencha Inspector下载Ext JS试用版(可在此处获得). 下载后,双击下载的文件以启动安装程序,然后按照 ...

  9. Python学习:2.Python集成学习环境(IDE)Pycharm的安装配置以及激活方

    一.下载Pycharm Pycharm作为Python现在最流行的集成开发环境,我们今后的Python的学习也就使用Pycharm进行,那今天我们就讲一下Pycharm的安装配置以及激活 1.我们首先 ...

  10. CAS解扰小结

    1.每个ts数据包由:1.包头 2.包数据 包头有个字段 PID ,该字段指示包数据的类型.比如说: PID 为 0x0000 包数据的类型就是 PAT表 PID 为 0x0001 包数据的类型就是 ...