char* caln(char** src) { int i; int m = -1; int a1 = -1; int a2 = -1; for (i = 0; i < MAXCOUNT; i++) { if ((src[i][0] >= '0' && src[i][0] <= '9' )|| (src[i][0] == '-'&&src[i][1])) { a1 = a2; a2 = i; } if (src[i][0] == '+' || (src[i][0] == '-'&&src[i][1]==0) || src[i][0] == '*' || src[i][0] == '/') { m = i; break; } } if (m == -1) { return src[a2]; } src[a1] = cal3(src[a1], src[a2], src[m]); src[a2][0] = src[m][0] = 0; return caln(src); }
int main() { int i,k,f,g,l; scanf("%d",&test); for(i=0;i<test;i++) { style=i; out[i]=10000; scanf("%d %d",&m,&n); for(j=0;j<m;j++) scanf("%s",inp[j]); for(j=0;j<m;j++) { for(k=0;k<n;k++) { sub[j][k]=10000; if(inp[j][k]=='C') choc++; else if(inp[j][k]=='T') { sor[0]=j; sor[1]=k; } else if(inp[j][k]=='W') { tar[0]=j; tar[1]=k; } } } f=sor[0]; g=sor[1]; h=tar[0]; j=tar[1]; printf("%d\n",choc); chocSub=choc; chocBak=choc; sub[f][g]=0; cal2(f,g,0); choc=chocBak; sub[f][g]=0; cal1(f,g,0); choc=chocBak; sub[f][g]=0; cal3(f,g,0); choc=chocBak; sub[f][g]=0; cal4(f,g,0); printf("%d %d\n",sub[h][j],out[i]); for(j=0;j<m;j++) { for(k=0;k<n;k++) { printf("%d\t",sub[j][k]); sub[j][k]=10000; } printf("\n"); } choc=0; } return 0; }
void cal1(int f,int g,int side) { int i,k,bak; if(sub[f][g]<10000) bak=sub[f][g]; else bak=-1; if(chocSub!=choc) { chocSub=choc; for(i=0;i<m;i++) for(k=0;k<n;k++) if(i!=f || k!=g) sub[i][k]=10000; } printf("One %d %d %d %c %d\n",f,g,sub[f][g],inp[f][g],choc); if(inp[f+1][g]!='#' && f+1<m) { if(inp[f+1][g]=='C') { if(sub[f+1][g]==10000 && choc>0) choc--; sub[f+1][g]=sub[f][g]+1; if(chocSub!=choc) { cal1(f+1,g,1); if(bak>0) sub[f][g]=bak; cal2(f+1,g,1); if(bak>0) sub[f][g]=bak; cal3(f+1,g,1); if(bak>0) sub[f][g]=bak; cal4(f+1,g,1); } else { if(side==0) { cal1(f+1,g,1); if(bak>0) sub[f][g]=bak; cal2(f+1,g,1); if(bak>0) sub[f][g]=bak; cal3(f+1,g,1); if(bak>0) sub[f][g]=bak; cal4(f+1,g,1);} else if(side==1) { cal2(f+1,g,1); if(bak>0) sub[f][g]=bak; cal3(f+1,g,1); if(bak>0) sub[f][g]=bak; cal1(f+1,g,1); } else if(side==4) { cal2(f+1,g,1); if(bak>0) sub[f][g]=bak; cal3(f+1,g,1); if(bak>0) sub[f][g]=bak; cal4(f+1,g,1); } } } else if(inp[f+1][g]=='W') { if(choc==0 && sub[f+1][g]>sub[f][g]+1) { sub[f+1][g]=sub[f][g]+1; } else if(choc!=0) { sub[f+1][g]=sub[f][g]+1; cal1(f+1,g,1); if(bak>0) sub[f][g]=bak; cal2(f+1,g,1); if(bak>0) sub[f][g]=bak; cal3(f+1,g,1); if(bak>0) sub[f][g]=bak; cal4(f+1,g,1); } } else if(inp[f+1][g]=='.' && (sub[h][j]==10000 || choc!=0)) { sub[f+1][g]=sub[f][g]+1; cal1(f+1,g,1); if(bak>0) sub[f][g]=bak; cal2(f+1,g,1); if(bak>0) sub[f][g]=bak; cal3(f+1,g,1); if(bak>0) sub[f][g]=bak; cal4(f+1,g,1); } else if(inp[f+1][g]=='T') { sub[f+1][g]=sub[f][g]+1; cal1(f+1,g,1); if(bak>0) sub[f][g]=bak; cal2(f+1,g,1); if(bak>0) sub[f][g]=bak; cal3(f+1,g,1); if(bak>0) sub[f][g]=bak; cal4(f+1,g,1); } } if(out[style]>sub[h][j] && choc==0) out[style]=sub[h][j]; }