UVA 215 Spreadsheet Calculator

模拟题。每个单元格有表达式就dfs,如果有环那么就不能解析,可能会重复访问到不能解析的单元格,丢set里或者数组判下重复。

这种题首先框架要对,变量名不要取的太乱,细节比较多,知道的库函数越多越容易写。注意细节,注意格式。

/*********************************************************
*      --------------Tyrannosaurus---------              *
*   author AbyssalFish                                   *
**********************************************************/
#include<bits/stdc++.h>
using namespace std;

typedef long long ll;

const int R = 20, C = 10, LEN = 76;

struct Node
{
    int n;
    string s;
    bool tp; //1 num 0 expr
    Node(){ s.reserve(LEN); }
}nd[R][C];
int Err[R][C], kas_clk;

void readNd(int x,int y)
{
    Node &u = nd[x][y];
    getline(cin, u.s);
    u.tp = !isalpha(u.s[0]);// - ,1, A
    if(u.tp) {
        stringstream ssin(u.s);
        ssin>>u.n;
    }
}

const int ErrorCode = 1<<30;

typedef pair<int,int> pii;
vector<pii > un_ev;

int vis[R][C], clk;
//parseNd
int dfs(int x,int y)
{
    Node &u = nd[x][y];
    if(u.tp) return u.n;
    if(Err[x][y] == kas_clk) return ErrorCode;
    if(vis[x][y] == clk) {
        Err[x][y] = kas_clk;
        un_ev.push_back(pii(x,y));
        return ErrorCode;
    }
    vis[x][y] = clk;
    int ans = 0, sz = u.s.size();
    //stack<char> stk;
    for(int i = 0; i < sz; i++){
        if(isalpha(u.s[i])){
            int val = dfs(u.s[i]-‘A‘,u.s[i+1]-‘0‘);
            if(val == ErrorCode) {
                if(Err[x][y] != kas_clk){
                    Err[x][y] = kas_clk;
                    un_ev.push_back(pii(x,y));
                }
                return ErrorCode;
            }
            char op = i?u.s[i-1]:‘+‘;//stk.top(); stk.pop();
            ans += op==‘+‘?val:-val;
            i++;
        }
        else if(isdigit(u.s[i])){
            int j = i+1;
            while(j < sz && isdigit(u.s[j])) j++;
            int val = atoi(u.s.substr(i,j).c_str());
            ans += u.s[i-1]==‘+‘?val:-val;
            i = j-1;
        }
        //if(s[i] == ‘+‘ || s[i] == ‘-‘){
        //}
    }
    u.tp = true;
    return u.n = ans;
}

void init()
{
    un_ev.reserve(R*C);
}

int r,c;
void solve()
{
    for(int i = 0; i < r; i++){
        for(int j = 0; j < c; j++){
            readNd(i,j);
        }
    }
    kas_clk++;
    for(int i = 0; i < r; i++)
        for(int j = 0; j < c; j++){
            if(Err[i][j] != kas_clk){
                clk++;
                dfs(i,j);
            }
        }
    if(un_ev.size()){
        sort(un_ev.begin(),un_ev.end());
        //un_ev.erase(unique(un_ev.begin(),un_ev.end()),un_ev.end());
        for(auto p: un_ev){
            int x = p.first, y = p.second;
            printf("%c%c: %s\n",x+‘A‘,y+‘0‘,nd[x][y].s.c_str());
        }
        un_ev.clear();
    }
    else {
        putchar(‘ ‘);
        for(int j = 0; j < c; j++) printf("%6d",j);
        puts("");
        for(int i = 0; i < r; i++){
            putchar(i+‘A‘);
            for(int j = 0; j < c; j++){
                printf("%6d",nd[i][j].n);
            }
            puts("");
        }
    }
    puts(""); //注意格式
}

//#define LOCAL
int main()
{
#ifdef LOCAL
    freopen("in.txt","r",stdin);
#endif
    //ios::sync_with_stdio(false);
    //cin.tie(nullptr);
    init();
    while(scanf("%d%d\n",&r,&c),r+c){
        solve();
    }
    return 0;
}
时间: 2024-10-17 17:59:19

UVA 215 Spreadsheet Calculator的相关文章

UVa - 12664 - Interesting Calculator

先上题目: 12664 Interesting CalculatorThere is an interesting calculator. It has 3 rows of button.• Row 1: button 0, 1, 2, 3, . . . , 9. Pressing each button appends that digit to the end of the display.• Row 2: button +0, +1, +2, +3, . . . , +9. Pressin

UVA之11549 - Calculator Conundrum

[题目] Problem C CALCULATOR CONUNDRUM Alice got a hold of an old calculator that can display n digits. She was bored enough to come up with the following time waster. She enters a number k then repeatedly squares it until the result overflows. When the

Spreadsheet Calculator 电子表格计算器 (Uva 215)

原题:https://uva.onlinejudge.org/external/2/215.pdf 有一个M x N的表格,每个单元格是个数字或者表达式.表达式由单元格编号和+ - 号组成 输出单元格的结果 思路:用dfs判断有向图环的问题 1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <utility> 5 #include <cstring>

UVa 12342 Tax Calculator (水题,纳税)

今天在uva看到一个水题,分享一下. 题意:制定纳税的总额,有几个要求,如果第一个180000,不纳,下一个300000,纳10%,再一个400000,纳15%,再一个300000,纳20%,以后的纳25%,如果总额大于0但是不过2000,纳2000, 如果总金额不是整数,纳离它最近的且比它大的整数. 析:没什么可说的,算一下就行,也没坑. 代码如下: #include <bits/stdc++.h> using namespace std; const int s[] = {1180000,

精品软件1

QQ:365543212 PTC系列产品: PTC Creo 3.0 M030 & HelpCenter Full Multilanguage Win32_64-ISO 3DVD PTC Creo 2.0 M180 & Help Center Full Multilanguage Win32_64 2DVD PTC.Creo.Elements.Direct.v18.1.M030-ISO 1DVD PTC Creo View 2.0 M030 Win32_64-ISO 2CD PTC Cre

[2016-03-19][UVA][11549][Calculator Conundrum]

时间:2016-03-19 21:27:43 星期六 题目编号:[2016-03-19][UVA][11549][Calculator Conundrum] 题目大意:给定数k每次取前n位不断平方,求出现的最大值是多少 方法: 方法1:模拟一遍过程,直到出现循环 方法2:Floyd判断算法,定义两个k,每次k1走一次,k2走两次,知道k1,k2相同 方法1:STL超级暴力方法 方法2:小小优化版 方法3:Floyd判圈算法 方法1:STL超级暴力方法 #include <set> #inclu

[UVa 11549]Calculator Conundrum

题解 显然按题意模拟会出现环,因为可能出现的数字数有限的,所以不可能无限的衍生下去. 那么我们就可以按题意模拟,遍历整个过程,统计最大值即可. 判环的环我们想到$hash$,也可以用$STL$中的$set$,但是复杂度高... $Floyd$判圈.一步两步法,有环的话肯定会相遇,空间复杂度可以降到$O(1)$,时间也快不少. 1 //It is made by Awson on 2017.9.18 2 #include <map> 3 #include <set> 4 #inclu

UVA 11549 Calculator Conundrum Floyd判圈

题目链接:点击打开链接 题意: 输入n k,表示计算器能显示n位数字,初始有一个数字k 每次操作 k = k^2, 若超出n位则截取前n位. 求能获得的最大数字. 思路: 首先我们能判断这个操作一定存在循环. 那么如何终止循环,利用Floyd判圈法 让两个循环child1和child2刚开始都为k,然后child1每次变换一次,child2每次变换2次: 这样当child1再次等于child2时说明已经至少经过一个循环节了,因为child2已经从后面赶上child1了 import java.i

[题解]UVa 11082 Matrix Decompressing

开始眨眼一看怎么也不像是网络流的一道题,再怎么看也觉得像是搜索.不过虽然这道题数据范围很小,但也不至于搜索也是可以随随便便就可以过的.(不过这道题应该是special judge,因为一题可以多解而且题目中然而并没有什么要求,所以说可以考虑思考一下这道题有木有什么"套路"之类的通法) 比如说有这么一组数据 原矩阵 1 2 3 4 7 8 9 5 6 输入 3 3 6 25 45 14 28 45 然后将每一行的和写在每一列对应的行上(很明显有问题) 6 0 0 19 0 0 20 0