PKU : 2577 - Interpreter

問題概要

http://poj.org/problem?id=2577

RAM上に連続して命令が書かれている.
順番に命令を実行して, 命令を何回実行したか答えよ.

アルゴリズム

シミュレーションするしかないです.

プログラム

int main(void){
  int loc = 0;
  int reg[10],a[1000],b[1000],c[1000];
  string s;

  memset(reg,0,sizeof(reg));
  memset(a,0,sizeof(a));
  memset(b,0,sizeof(b));
  memset(c,0,sizeof(c));

  for(int i=0;cin>>s;i++){
    a[i] = s[0] - '0';
    b[i] = s[1] - '0';
    c[i] = s[2] - '0';
  }

  int ans = 0;
  while(1){
    ans++;

    if(a[loc] == 0){
      if(reg[c[loc]] != 0){
        loc = reg[b[loc]];
        continue;
      }
    }
    else if(a[loc] == 1){
      if(b[loc] == 0 && c[loc] == 0){
        break;
      }
    }
    else if(a[loc] == 2){
      reg[b[loc]] = c[loc];
    }
    else if(a[loc] == 3){
      reg[b[loc]] = (reg[b[loc]] + c[loc]) % 1000;
    }
    else if(a[loc] == 4){
      reg[b[loc]] = (reg[b[loc]] * c[loc]) % 1000;
    }
    else if(a[loc] == 5){
      reg[b[loc]] = reg[c[loc]];
    }
    else if(a[loc] == 6){
      reg[b[loc]] = (reg[b[loc]] + reg[c[loc]]) % 1000;
    }
    else if(a[loc] == 7){
      reg[b[loc]] = (reg[b[loc]] * reg[c[loc]]) % 1000;
    }
    else if(a[loc] == 8){
      int idx = reg[c[loc]];
      reg[b[loc]] = a[idx] * 100 + b[idx] * 10 + c[idx];
    }
    else if(a[loc] == 9){
      int idx = reg[c[loc]];
      a[idx] = reg[b[loc]] / 100;
      b[idx] = reg[b[loc]] / 10 % 10;
      c[idx] = reg[b[loc]] % 10;
    }
    loc++;
  }

  cout<<ans<<endl;
}