Straight forward simulating.
Code:
- /*************************************************************************
- * Copyright (C) 2008 by liukaipeng *
- * liukaipeng at gmail dot com *
- *************************************************************************/
- /* @JUDGE_ID 00000 10033 C "Interpreter" */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <strings.h>
- #define RAM_MAX 1000
- #define REG_MAX 10
- int interpret(int ram[])
- {
- int instrs;
- int regs[REG_MAX] = {0};
- int addr = 0;
- int instr;
- int halt = 0;
- for (instrs = 0; !halt; ++instrs) {
- int instr = ram[addr];
- int oper = instr / 100;
- int arg1 = instr % 100 / 10;
- int arg2 = instr % 10;
- ++addr;
- addr %= RAM_MAX;
- switch (oper) {
- case 1:
- halt = 1;
- break;
- case 2:
- regs[arg1] = arg2;
- break;
- case 3:
- regs[arg1] += arg2;
- regs[arg1] %= RAM_MAX;
- break;
- case 4:
- regs[arg1] *= arg2;
- regs[arg1] %= RAM_MAX;
- break;
- case 5:
- regs[arg1] = regs[arg2];
- break;
- case 6:
- regs[arg1] += regs[arg2];
- regs[arg1] %= RAM_MAX;
- break;
- case 7:
- regs[arg1] *= regs[arg2];
- regs[arg1] %= RAM_MAX;
- break;
- case 8:
- regs[arg1] = ram[regs[arg2]];
- break;
- case 9:
- ram[regs[arg2]] = regs[arg1];
- break;
- case 0:
- if (regs[arg2] != 0)
- addr = regs[arg1];
- break;
- default:
- break;
- }
- }
- return instrs;
- }
- int main(int argc, char *argv[])
- {
- #ifndef ONLINE_JUDGE
- char in[256];
- char out[256];
- strcpy(in, argv[0]);
- strcat(in, ".in");
- freopen(in, "r", stdin);
- strcpy(out, argv[0]);
- strcat(out, ".out");
- freopen(out, "w", stdout);
- #endif
- int cases;
- scanf("%d/n", &cases);
- while (cases-- > 0) {
- int ram[RAM_MAX] = {0};
- int addr = 0;
- char buf[10];
- while (fgets(buf, 10, stdin) != NULL && buf[0] != '/n')
- ram[addr++] = atoi(buf);
- printf("%d/n", interpret(ram));
- if (cases > 0)
- putchar('/n');
- }
- return 0;
- }