uva 196 Spreadsheet 拓扑排序 。坑爹的一题

uva 196 Spreadsheet

这题字符串处理上还是有点麻烦的,不过也还是可以处理

然后就是拓扑排序, 一开始是用一个个删除度数0的点的方法, 在POJ上过了 POJ数据果断水。。。 在UVA上无限超时。坑爹啊。 后来换成用DFS过了。不容易

PS:这题数据上是说要1 ~ 999 * 1 ~ 1800000多少的数据。。非常大。可是实际上只要开1000*1000的数组就可以过掉了。。 又是坑爹

代码
#include <stdio.h>
#include <string.h>

struct SB
{
	int num;
	int x[50];
	int y[50];
	int rx[55];
	int ry[55];
	int z;
	int zz;
	int du;
	int judge;
} map[1005][1005];

int t;
int n, m;
int i, j, k;
int ii, jj;
char sb[2005];

int dfs(int x, int y)
{
	int i;
	if (map[x][y].z == 0)
		return map[x][y].num;
	for (i = 0; i < map[x][y].z; i++)  
        map[x][y].num += dfs(map[x][y].x[i], map[x][y].y[i]);  
    map[x][y].z = 0;  
    return map[x][y].num;  
}
int main()
{
	scanf("%d", &t);
	while (t --)
	{
		memset(map, 0, sizeof(map));
		memset(sb, 0, sizeof(sb));
		scanf ("%d%d", &m, &n);
		for (i = 1; i <= n; i ++)
		{
			getchar();
			for (j = 1; j <= m; j ++)
			{
				scanf("%s", sb);
				int l = strlen(sb);
				if (sb[0] != '=')  
				{
					int num = 0;
					int f = 0; 
					if (sb[0] == '-') 
						f = 1;  
					for (k = f; k < l; k ++)  
						num = num * 10 + sb[k] - '0';  
					map[i][j].num = num;  
					if (f == 1) 
						map[i][j].num = -map[i][j].num;    
				} 
				else  
				{
					int column = 0; 
					int row = 0; 
					int pos = 1;  
					map[i][j].num = 0;  
					while (pos < l)  
					{
						while ((sb[pos] >= 'A') && (sb[pos] <= 'Z'))
						{
							column = column * 26 + sb[pos]-'A'+1; 
							++pos;
						}  
						while ((pos < l) && (sb[pos] >= '0') && (sb[pos] <= '9'))
						{
							row = row * 10 + sb[pos] - '0';
							++ pos;
						}
						map[i][j].x[map[i][j].z] = row;
						map[i][j].y[map[i][j].z] = column;
						map[i][j].du ++;
						map[row][column].rx[map[row][column].zz] = i;
						map[row][column].ry[map[row][column].zz] = j;
						map[row][column].zz ++;
						map[i][j].z ++;
						row = 0; 
						column = 0; 
						++ pos;  
					}  
				}
			}
		}
		for(i = 1; i <= n; i++)  
            for(j = 1; j <= m; j++)  
			{
				if(map[i][j].z) 
					dfs(i, j);
			}
		for (i = 1; i <= n; i ++)
		{
			for (j = 1; j < m; j ++)
			{
				printf("%d ", map[i][j].num);
			}
			printf("%d\n", map[i][m].num);
		}
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值