题意:我们把每一个坐标视为一个点,那这个问题就转化为拓扑排序问题了
#include <iostream>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
using namespace std;
const int MAXN = 1001*1001;
int in[MAXN],c,r,sheet[MAXN];
int G[MAXN][100]; //记录 i 的 先行条件 j
bool dfs(int u)
{
int s = 0 ;
for (int i = 0 ; i < in[u] ; i++)
{
if (in[G[u][i]] && !dfs(G[u][i])) //不能存在环
return false;
s += sheet[G[u][i]];
}
sheet[u] = s ;
in[u] = 0 ; //注意
return true;
}
bool toposort()
{
for (int i = 0 ; i < r*c ; i++)
if(in[i] && !dfs(i));
return false;
return true;
}
int main()
{
int t,i;
scanf("%d",&t);
while (t--)
{
memset(in,0,sizeof(in));
memset(G,0,sizeof(G));
scanf("%d%d",&c,&r);
for ( i = 0 ; i < c*r ; i++)
{
char s[1000];
scanf("%s",s);
int k=1,t=0,num=0;
if (s[0] == '=')
{
int len = strlen(s);
s[len] = '+';
s[len+1] = '\0';
while (s[k])
{
if (isalpha(s[k]))
t = t *26 + s[k] - 'A' + 1;
else if (isdigit(s[k]))
num = num *10 + s[k] - '0';
else
{
G[i][in[i]++] =( num - 1)*c + t - 1; //这个位置的入度有谁
num = t = 0;
}
k++;
}
}
else sscanf(s,"%d",&sheet[i]);
}
toposort();
for (i = 0 ; i < c*r ; i++)
{
if (i && !(i % c))
printf("\n");
if (i % c )
printf(" ");
printf("%d",sheet[i]);
}
printf("\n");
}
return 0;
}