题目大意:模拟题,有一些寄存器和随机访问内存,给你一些指令以及它们代表的操作,模拟操作即可。
1 #include <cstdio> 2 #include <cstring> 3 #define REGN 10 4 #define RAMN 1000 5 6 int reg[REGN], ram[RAMN]; 7 8 int main() 9 { 10 #ifdef LOCAL 11 freopen("in", "r", stdin); 12 //freopen("out", "w", stdout); 13 #endif 14 int n; 15 scanf("%d", &n); 16 getchar(); 17 char s[100]; 18 fgets(s, sizeof(s), stdin); 19 bool first = true; 20 while (n--) 21 { 22 memset(ram, 0, sizeof(ram)); 23 int k = 0; 24 while (fgets(s, sizeof(s), stdin)) 25 { 26 if (s[0] == ' ') break; 27 sscanf(s, "%d", &ram[k]); 28 k++; 29 } 30 int p = 0; // p point to the location that will execute 31 int cnt = 0; 32 memset(reg, 0, sizeof(reg)); 33 bool end = false; 34 while (!end) 35 { 36 //printf("%d ", ram[p]); 37 int hund = ram[p] / 100; 38 int ten = (ram[p] % 100) / 10; 39 int unit = ram[p] % 10; 40 cnt++; 41 switch(hund) 42 { 43 case 1: 44 if (ram[p] == 100) 45 { 46 end = true; 47 break; 48 } 49 case 2: 50 reg[ten] = unit; 51 p++; 52 break; 53 case 3: 54 reg[ten] += unit; 55 reg[ten] %= 1000; 56 p++; 57 break; 58 case 4: 59 reg[ten] *= unit; 60 reg[ten] %= 1000; 61 p++; 62 break; 63 case 5: 64 reg[ten] = reg[unit]; 65 p++; 66 break; 67 case 6: 68 reg[ten] += reg[unit]; 69 reg[ten] %= 1000; 70 p++; 71 break; 72 case 7: 73 reg[ten] *= reg[unit]; 74 reg[ten] %= 1000; 75 p++; 76 break; 77 case 8: 78 reg[ten] = ram[reg[unit]]; 79 p++; 80 break; 81 case 9: 82 ram[reg[unit]] = reg[ten]; 83 p++; 84 break; 85 case 0: 86 if (reg[unit] != 0) p = reg[ten]; 87 else p++; 88 break; 89 } 90 } 91 if (first) first = false; 92 else printf(" "); 93 printf("%d ", cnt); 94 } 95 return 0; 96 }
第一次没在输出之间加一个空行,WA了,又粗心了...同时,又一次疑惑,uva对这种情况是判别为WA而不是PE吗?