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

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

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 ;
}

最新文章

  1. 全网络最正确的让 Linux 开机进入字符界面的方法及设置 FrameBuffer 分辨率的方法
  2. 《Entity Framework 6 Recipes》中文翻译系列 (13) -----第三章 查询之使用Entity SQL
  3. TransactionScope 之分布式配置
  4. AngularJs form.FormController、ngModel.NgModelController
  5. mongodb(二) 安装和使用
  6. [python]非常小的下载图片脚本(非通用)
  7. IOS之UI--小实例项目--添加商品和商品名(使用xib文件终结版) + xib相关知识点总结
  8. Ubuntu下virtualbox nat网络模式下 实现宿主机访问虚拟机
  9. CentOS_6.5 64位系统,安装git服务器+客户端
  10. Android 根据屏幕分辨率自动调整字体大小
  11. Arrays.sort的粗略讲解
  12. 【poj解题】1308
  13. Asp.Net生命周期的详解
  14. vs 2015 rdlc报表绑定datagridview中的数据
  15. 2019-04(2)Python学习
  16. 20155312 张竞予 Exp 8 Web基础
  17. 一脸懵逼学习Hadoop中的序列化机制——流量求和统计MapReduce的程序开发案例——流量求和统计排序
  18. Vue与Element走过的坑。。。。带上Axios
  19. apacheh2.4和php5.5集成环境遇到的问题
  20. MyBatis动态SQL foreach标签实现批量插入

热门文章

  1. iOS之报错“Cannot create __weak reference in file using manual reference counting”解决办法
  2. Java 基础标识符
  3. 不再手写import - VSCode自动引入Vue组件和Js模块
  4. 免安装版Tomcat9中间件的安装
  5. Mysql连接报2003-10061以及1045错误
  6. 避免 ‘sudo echo xxxx &gt;’ 时候 出现 “permission denied”
  7. 清除input框的缓存
  8. Yii2.0 游客访问限制(转)
  9. 图的遍历(Python实现)
  10. 3. 进程间通信IPC