欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-02-11 13:19:52
...

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

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


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

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


/*
    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];
    }
}
相关标签: 拓扑偏序 map

上一篇: Jzoj4747 被粉碎的线段树

下一篇: