还好数据范围不是很大,开始时用了a[1000]][20000][1000]一直RE
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
#include<math.h>
int list[1000][1000],vis[1000][1000];
char a[1000][1000][1000];
int tonum(char *s)//转换成int类型
{
int i,num;
num=s[0]-'0';
for(i=1;i<strlen(s);i++)
num=num*10+s[i]-'0';
return num;
}
void getwhere(char *s,int *u,int *v)//获得行列坐标
{
int i,num;
num=s[0]-'A'+1;
for(i=1;i<strlen(s);i++)
{
if(isalpha(s[i]))
num=num*26+s[i]-'A'+1;
else break;
}
*u=num;
*v=tonum(strchr(s,s[i]));
}
int dfs(char *p)//计算一个格子的表达式的值
{
int k,sum,num,u,v;
char s[20];
sum=num=0;
for(k=1;k<=strlen(p);k++)
{
if(p[k]!='+'&&p[k]!='\0')
{
s[num++]=p[k];
continue;
}
s[num]='\0';
getwhere(s,&u,&v);
if(vis[v-1][u-1])
{
vis[v-1][u-1]=0;
list[v-1][u-1]=dfs(a[v-1][u-1]);
}
sum+=list[v-1][u-1];
num=0;
}
return sum;
}
main()
{
int i,j,k,T,r,c,num;
//freopen("D:\\o.txt","r",stdin);
scanf("%d",&T);
while(T--)
{
num=0;
memset(vis,0,sizeof(vis));
memset(list,0,sizeof(list));
scanf("%d%d",&c,&r);
getchar();
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
{
scanf("%s",a[i][j]);
if(a[i][j][0]=='=')//表达式
vis[i][j]=1;
else
list[i][j]=tonum(a[i][j]);
}
}
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
{
if(vis[i][j])
{
vis[i][j]=0;
list[i][j]=dfs(a[i][j]);
}
printf("%d",list[i][j]);
if(j!=c-1) printf(" ");
}
printf("\n");
}
}
return 0;
}