您的位置:首页 > 其它

【HDOJ】1341 Simple Computers

2014-11-25 22:25 141 查看
注意PC要与31.

#include <cstdio>
#include <cstring>
#include <cstdlib>

#define MAXN 40
#define MAXL 10

char mem[MAXN][MAXL];
char ans[MAXL];

int getv(char s[], int i, int j) {
int ret = 0;

while (i < j) {
ret = (ret<<1) + s[i] - '0';
++i;
}

return ret;
}

void store(char s[], unsigned char acc) {
int i = 0;
int v = (int)acc;
int mask = 0x80;

for (i=0; i<8; ++i) {
if (v & mask) {
s[i] = '1';
} else {
s[i] = '0';
}
mask >>= 1;
}
s[i] = '\0';
}

void solve() {
int op, addr;
int tmp;
bool nhalt = true;
unsigned char acc = 0;
int pc = 0;

while (nhalt) {
pc &= 0x1f;
op = getv(mem[pc], 0, 3);
addr = getv(mem[pc], 3, 8);
++pc;
switch (op) {
case 0:
store(mem[addr], acc);
break;

case 1:
tmp = getv(mem[addr], 0, 8);
acc = (unsigned char) tmp;
break;

case 2:
if (acc == 0)
pc = addr;
break;

case 3:
break;

case 4:
--acc;
break;

case 5:
++acc;
break;

case 6:
pc = addr;
break;

case 7:
nhalt = false;
break;

default:
break;
}
}

store(ans, acc);
}

int main() {
int i;

#ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
#endif

while (1) {
i = 0;
if (scanf("%s", mem[i++]) == EOF)
break;
while (i < 32)
scanf("%s", mem[i++]);
solve();
printf("%s\n", ans);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: