【uva-196】Spreadsheet (拓扑排序)妈呀居然过了

来源:互联网 发布:js日期转换为数字 编辑:程序博客网 时间:2024/04/28 17:43

题目大意:
表格位置:列是字母,行是数字。
一些位置是值一些位置是关系式,关系只有+,这就简单很多了但我还是写了很多很多。
最后要求输出计算所有关系式之后的全是值的表格。

思路:
拓扑排序。
利用两个坐标之间的偏序关系。


唉本死宅情绪低落的时候是找不到可以寻求安慰的事和人的。
就写代码吧但是代码也写的特别慢。唉,本来就比较愚蠢吧。
希望快点走出这种辣鸡糟糕的情绪看破红尘。
人生真是艰难。
丧到极点写了快一百五十行。。。

这里写图片描述


/*    uva 196 by zhuhua    Time limit: 3000 ms    AC Time: 80 ms*/#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <vector>#include <map>using namespace std;struct pos{    int x,y;    pos(int xx=0,int yy=0){x=xx;y=yy;}    bool operator<(const pos b) const    {        if(x!=b.x)        return x < b.x;        return y < b.y;    }};const int LEN=20000;int n,m;int sheet[1100][LEN];map < pos,vector<pos> >order;int ordersiz;map < pos,bool> ok;void translate(int a,int b,string ind);void dfs(pos now);int main(){    int t;    string input,temp,index;    int i,j,k,num;    scanf("%d",&t);    while(t--)    {        scanf(" %d %d",&n,&m);        getchar();        memset(sheet,0,sizeof(sheet));        order.erase(order.begin(),order.end());        ordersiz=0;        ok.erase(ok.begin(),ok.end());        for(i=1;i<=m;i++)        {            for(j=1;j<=n;j++)            {                cin>>input;                if(input[0]=='=')                {                    for(k=1,index="";k<input.length();k++)                    {                        if(input[k]=='+')                            {                                translate(i,j,index);                                index.clear();                            }                        else                            index+=input[k];                    }                    translate(i,j,index);                    ok[pos(i,j)]=false;                }                else                {                    num=0;                    k=0;                    bool fu=false;                    if(input[0]=='-')                        {fu=true;++k;}                    for(;k<input.length();k++)                        num=num*10+input[k]-'0';                    if(fu)num*=-1;                    sheet[i][j]=num;                    ok[pos(i,j)]=true;                }            }        }        map < pos,vector<pos> >::iterator it;        for(it=order.begin();it!=order.end();it++)        {            pos now;            now.x=it->first.x;            now.y=it->first.y;            if(!ok[now])                {                    dfs(now);                    ok[now]=true;                }        }        for(i=1;i<=m;i++)        {            for(j=1;j<=n;j++)            {                if(j-1)cout<<' ';                cout<<sheet[i][j];            }cout<<endl;        }    }    return 0;}void translate(int a,int b,string ind){    int i=0,xx=0,yy=0;    int len=ind.length();    while(i<len&&ind[i]<='Z'&&ind[i]>='A')    {        yy=yy*26+(ind[i]-'A'+1);        i++;    }    while(i<len)    {        xx=xx*10+(ind[i]-'0');        i++;    }    order[pos(a,b)].push_back(pos(xx,yy));}void dfs(pos now){    int a=now.x;    int b=now.y;    for(int i=0;i<order[now].size();i++)    {        pos next;        next.x=order[now][i].x;        next.y=order[now][i].y;        if(!ok[next])        {            dfs(next);            ok[next]=true;        }        sheet[a][b]+=sheet[next.x][next.y];    }}