uva196

来源:互联网 发布:托派 萝莉控 知乎 编辑:程序博客网 时间:2024/06/07 07:03

还好数据范围不是很大,开始时用了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;elselist[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;}


原创粉丝点击