这个题其实就是一个模拟,可以题中内存限制却是10MB,读懂题发现按照题目所述需要的数组异常庞大,此外题目并无其他说明。题意比较好理解,大意就是给你一个表格,里面可能是数字或者表达式,你需要完成表达式中的计算,并输出整张表。
在网上寻求别人做法的时候才发现居然数组只需要100*100就够了,唉~~~我的做法与它的类似,也是根据DFS去做,直接贴代码
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
bool has[100][100];
int map[100][100],n,m;
char mapstr[100][100][100];
int GetNum(char *str)
{
int ans=0;
for(int i=0;i<strlen(str);i++)
ans=ans*10+str[i]-'0';
return ans;
}
int GetY(char *str)
{
if(strlen(str)==1)
return str[0]-'A'+1;
if(strlen(str)==2)
return (str[0]-'A'+1)*26+str[1]-'A'+1;
if(strlen(str)==3)
return (str[0]-'A'+1)*676+(str[1]-'A'+1)*26+str[2]-'A'+1;
}
int DFS(int x,int y)
{
if(has[x][y])
return map[x][y];
int ans=0,itx=0,ity=0,len=strlen(mapstr[x][y]);
for(int i=1;i<len;i++)
{
char ita[100],cou=0;
itx=ity=0;
while(mapstr[x][y][i]>='A')
{
ita[cou]=mapstr[x][y][i];
cou++;
i++;
}
ita[cou]='\0';
ity=GetY(ita);
while(mapstr[x][y][i]!='+'&&i<len)
{
itx=itx*10+mapstr[x][y][i]-'0';
cou++;
i++;
}
ans+=DFS(itx,ity);
}
return ans;
}
int main()
{
int cas;
scanf("%d",&cas);
while(cas--)
{
memset(has,0,sizeof(has));
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
{
char str[50];
scanf("%s",str);
if(str[0]!='=')
{
map[i][j]=GetNum(str);
has[i][j]=1;
}
else
strcpy(mapstr[i][j],str);
}
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
{
if(has[i][j])
continue;
map[i][j]=DFS(i,j);
has[i][j]=1;
}
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
{
if(j!=n)
printf("%d ",map[i][j]);
else
printf("%d\n",map[i][j]);
}
}
return 0;
}