您的位置:首页 > 其它

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

2017-11-08 00:44 597 查看
题目大意:

表格位置:列是字母,行是数字。

一些位置是值一些位置是关系式,关系只有+,这就简单很多了但我还是写了很多很多。

最后要求输出计算所有关系式之后的全是值的表格。

思路:

拓扑排序。

利用两个坐标之间的偏序关系。

唉本死宅情绪低落的时候是找不到可以寻求安慰的事和人的。

就写代码吧但是代码也写的特别慢。唉,本来就比较愚蠢吧。

希望快点走出这种辣鸡糟糕的情绪看破红尘。

人生真是艰难。

丧到极点写了快一百五十行。。。



/*
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);

4000
ok[next]=true;
}
sheet[a][b]+=sheet[next.x][next.y];
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  拓扑偏序 map