#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
using namespace std;
int m,n;
string s[1000][20000];
char c[1000*1000];//c是全局变量,在内层的dfs中c已经被修改了!
int map_[1000][20000];
bool vis[1000][20000];
int dfs(string s1)//dfs计算这个字符串的结果
{
strcpy(c,s1.c_str());
int num=0;
int len=s1.length();
for(int i=0;i<len;i++)
{
int x=0;
int y=0;
while(s1[i]!='+' && s1[i]!='\0')//再加一就遇到了外层循环的判断条件!
{
if(s1[i]<='Z' && s1[i]>='A')
y=y*26+s1[i]-'A'+1;
else if(s1[i]<='9' && s1[i]>='0')
x=x*10+s1[i]-'0';
i++;
}
if(!vis[x][y])
{
map_[x][y]=dfs(s[x][y]);
vis[x][y]=true;//没有更新这个vis数组……找了好久
num+=map_[x][y];
}
else
num+=map_[x][y];
}
return num;
}
int main()
{
// freopen("debug\\in.txt","r",stdin);
// freopen("debug\\out.txt","w",stdout);
int cases;
cin>>cases;
while(cases--)
{
memset(map_,0,sizeof(map_));
memset(vis,0,sizeof(vis));
scanf("%d%d",&m,&n);
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
cin>>s[i][j];
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
{
strcpy(c,s[i][j].c_str());
if(c[0]!='=')
{
sscanf(c,"%d",&map_[i][j]);
vis[i][j]=true;
}
}
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
{
if(s[i][j][0]=='=')
{
map_[i][j]=dfs(s[i][j]);
vis[i][j]=true;
}
}
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
if(j!=m) cout<<map_[i][j]<<" ";
else cout<<map_[i][j]<<endl;
}
}
}
return 0;
}
/*
2
10 10
1 =J10 =G6 =I5 =D2 =A10 =B6 =B7 =E5 =D7
=I2 =C10 =G3 =G5 =B7 =F8 =J1 =H3 =E9 =I10
=G5 =E9 =A1 =B9 =I7 =I5 =A10 2 =D3 =B3
=G3 =H4 =A1 =C10 =H3 =J10 =J6 =H2 =E7 =C6
=C9 =A2 =I5 4 =D5+G5 =D6 =B6 =B2 =G6 =A7
=D9 =I7 =I2 =A1+G5 =A2 =J3 =A1+D5 =F3 =J9 =F1
=F1 =D6 =D5 =A4 =J7 =H2 =E5 =J1 =E4 =J3
=I10 =E9 =I1 =F1 =J1 =D5 =I10 =C3 =C3 =H3
=A7 =D5 =E1 =D6 =D3 =I2 =H10 =G9 =G3 =I2
=C4 =I1 =A8 =E2 =C2 =C3 =B9 =E5 =C8 =B5
1 4 5 5 2 1 2 3 6 1
4 6 1 2 3 4 1 2 4 6
2 4 1 4 2 5 1 2 4 4
1 2 1 6 2 4 1 2 4 4
2 4 5 4 6 3 2 6 5 1
3 2 4 3 4 4 5 5 4 1
1 3 4 1 4 2 6 1 2 4
6 4 6 1 1 4 6 1 1 2
1 4 2 3 4 4 6 6 1 4
1 6 6 3 1 1 4 6 6 4
*/
可以说是调了很长时间了……