コード例 #1
0
ファイル: cal.c プロジェクト: Jmq14/XV6
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];
}