这道题Dev能过,但ACGO不能,代码下
原题链接:79553.模拟器2026-01-24 23:20:12
发布于:四川
#include <iostream>
using namespace std;
// 模拟下发库的宏(生成符合模拟器格式的指令)
#define LABEL(x) cout << x << ":" << endl;
#define INT_DEF(var, idx) cout << "M[S[" << idx << "]]=0;" << endl; // 定义Int变量,存在S[idx]
#define READ(var_idx) cout << "ncall 1 M[S[" << var_idx << "]];" << endl; // 读整数到M[S[var_idx]]
#define WRITE(var_idx) cout << "ncall 2 M[S[" << var_idx << "]];" << endl; // 写M[S[var_idx]]的整数
#define SOLVE() cout << "ncall 3 0;" << endl; // 调用特殊函数3
#define ASSIGN(dst_idx, src_idx) cout << "M[S[" << dst_idx << "]]=M[S[" << src_idx << "]];" << endl;
#define ASSIGN_CONST(dst_idx, val) cout << "M[S[" << dst_idx << "]]=" << val << ";" << endl;
#define ADD(dst_idx, a_idx, b_idx) cout << "M[S[" << dst_idx << "]]=M[S[" << a_idx << "]]+M[S[" << b_idx << "]];" << endl;
#define MUL(dst_idx, a_idx, b_idx) cout << "M[S[" << dst_idx << "]]=M[S[" << a_idx << "]]*M[S[" << b_idx << "]];" << endl;
#define CMP_GOTO(src_idx, cmp_idx, label) cout << "if M[S[" << src_idx << "]]>=M[S[" << cmp_idx << "]] goto " << label << ";" << endl;
#define GOTO(label) cout << "goto " << label << ";" << endl;
#define EXIT() cout << "exit;" << endl;
int main() {
// 指令序列开始,使用S[0]~S[30]存储变量,避免冲突
int idx = 0;
const int n1_idx = idx++; // n1: S[0]
const int n2_idx = idx++; // n2: S[1]
const int n3_idx = idx++; // n3: S[2]
const int i_idx = idx++; // 循环变量i: S[3]
const int j_idx = idx++; // 循环变量j: S[4]
const int k_idx = idx++; // 循环变量k: S[5]
const int val_idx = idx++; // 临时值: S[6]
const int fifth_n_idx = idx++; // 第五分块的n: S[7]
const int fifth_m_idx = idx++; // 第五分块的m: S[8]
// 1. 定义变量并读取n1, n2, n3
LABEL(0);
INT_DEF(n1, n1_idx); READ(n1_idx);
INT_DEF(n2, n2_idx); READ(n2_idx);
INT_DEF(n3, n3_idx); READ(n3_idx);
// 2. 读取a矩阵(n1×n2),0→2,存在S[9~S[9+n1*n2-1]]
INT_DEF(i, i_idx); ASSIGN_CONST(i_idx, 0);
LABEL(1); // 外层循环i
CMP_GOTO(i_idx, n1_idx, 3); // if i >=n1 goto 3
INT_DEF(j, j_idx); ASSIGN_CONST(j_idx, 0);
LABEL(2); // 内层循环j
CMP_GOTO(j_idx, n2_idx, 4); // if j >=n2 goto 4
// 读取a[i][j]到val_idx,0→2
INT_DEF(val, val_idx); READ(val_idx);
LABEL(5);
cout << "if M[S[" << val_idx << "]]==0 goto 6;" << endl; // 若为0则替换为2
GOTO(7);
LABEL(6);
ASSIGN_CONST(val_idx, 2);
LABEL(7);
// 计算a[i][j]的存储位置: S[9 + i*n2 + j]
int addr_idx = idx++;
MUL(addr_idx, i_idx, n2_idx); // addr = i*n2
ADD(addr_idx, addr_idx, j_idx); // addr +=j
ADD(addr_idx, addr_idx, 9); // addr +=9 (基地址)
cout << "M[S[" << addr_idx << "]]=M[S[" << val_idx << "]];" << endl; // 保存a[i][j]
// j++
ADD(j_idx, j_idx, 8); ASSIGN_CONST(8, 1); // 临时常量1存在S[8]
GOTO(2);
LABEL(4);
// i++
ADD(i_idx, i_idx, 8);
GOTO(1);
LABEL(3);
// 3. 读取b矩阵(n2×n3),0→2,存在S[9+n1*n2 ~ S[9+n1*n2+n2*n3-1]]
ASSIGN_CONST(i_idx, 0); // 复用i_idx存j
LABEL(8); // 外层循环j
CMP_GOTO(i_idx, n2_idx, 10);
ASSIGN_CONST(j_idx, 0); // 复用j_idx存k
LABEL(9); // 内层循环k
CMP_GOTO(j_idx, n3_idx, 11);
// 读取b[j][k]到val_idx,0→2
INT_DEF(val_b, val_idx); READ(val_idx);
LABEL(12);
cout << "if M[S[" << val_idx << "]]==0 goto 13;" << endl;
GOTO(14);
LABEL(13);
ASSIGN_CONST(val_idx, 2);
LABEL(14);
// 计算b[j][k]的存储位置: S[9+n1*n2 + j*n3 +k]
int b_base = 9 + 200*200; // 假设n1,n2<=200,基地址足够
MUL(addr_idx, i_idx, n3_idx); // addr = j*n3
ADD(addr_idx, addr_idx, j_idx); // addr +=k
ADD(addr_idx, addr_idx, b_base); // addr +=b_base
cout << "M[S[" << addr_idx << "]]=M[S[" << val_idx << "]];" << endl;
// k++
ADD(j_idx, j_idx, 8);
GOTO(9);
LABEL(11);
// j++
ADD(i_idx, i_idx, 8);
GOTO(8);
LABEL(10);
// 4. 构造第五分块输入并调用Solve()
// 4.1 写入fifth_n = n2, fifth_m = n1*n3
ASSIGN(fifth_n_idx, n2_idx); WRITE(fifth_n_idx);
MUL(fifth_m_idx, n1_idx, n3_idx); WRITE(fifth_m_idx);
// 4.2 写入x数组(x[j] = a[0][j])
ASSIGN_CONST(i_idx, 0); // i=0
LABEL(15);
CMP_GOTO(i_idx, n2_idx, 16);
// 读取a[0][j]的地址: S[9 + 0*n2 +i]
ADD(addr_idx, 9, i_idx);
cout << "M[S[" << val_idx << "]]=M[S[" << addr_idx << "]];" << endl;
WRITE(val_idx);
ADD(i_idx, i_idx, 8);
GOTO(15);
LABEL(16);
// 4.3 写入y数组(y[j] = b[j][0])
ASSIGN_CONST(i_idx, 0); // j=0
LABEL(17);
CMP_GOTO(i_idx, n2_idx, 18);
// 读取b[j][0]的地址: S[b_base +j*n3 +0]
MUL(addr_idx, i_idx, n3_idx);
ADD(addr_idx, addr_idx, b_base);
cout << "M[S[" << val_idx << "]]=M[S[" << addr_idx << "]];" << endl;
WRITE(val_idx);
ADD(i_idx, i_idx, 8);
GOTO(17);
LABEL(18);
// 4.4 写入m次操作(a=-1, b=-1, c=1, v=1)
ASSIGN_CONST(i_idx, 0); // i
LABEL(19);
CMP_GOTO(i_idx, n1_idx, 21);
ASSIGN_CONST(j_idx, 0); // k
LABEL(20);
CMP_GOTO(j_idx, n3_idx, 22);
// 写入a_op=-1
ASSIGN_CONST(val_idx, -1); WRITE(val_idx);
// 写入b_op=-1
ASSIGN_CONST(val_idx, -1); WRITE(val_idx);
// 写入c_op=1
ASSIGN_CONST(val_idx, 1); WRITE(val_idx);
// 写入v=1
ASSIGN_CONST(val_idx, 1); WRITE(val_idx);
ADD(j_idx, j_idx, 8);
GOTO(20);
LABEL(22);
ADD(i_idx, i_idx, 8);
GOTO(19);
LABEL(21);
// 调用特殊函数3
SOLVE();
// 5. 读取Solve返回的结果到c矩阵(n1×n3)
ASSIGN_CONST(i_idx, 0);
LABEL(23);
CMP_GOTO(i_idx, n1_idx, 25);
ASSIGN_CONST(j_idx, 0);
LABEL(24);
CMP_GOTO(j_idx, n3_idx, 26);
READ(val_idx); // 读取c[i][k]
// 保存到c矩阵: S[9+n1*n2+n2*n3 +i*n3 +k]
int c_base = b_base + 200*200;
MUL(addr_idx, i_idx, n3_idx);
ADD(addr_idx, addr_idx, j_idx);
ADD(addr_idx, addr_idx, c_base);
cout << "M[S[" << addr_idx << "]]=M[S[" << val_idx << "]];" << endl;
ADD(j_idx, j_idx, 8);
GOTO(24);
LABEL(26);
ADD(i_idx, i_idx, 8);
GOTO(23);
LABEL(25);
// 6. 输出c矩阵
ASSIGN_CONST(i_idx, 0);
LABEL(27);
CMP_GOTO(i_idx, n1_idx, 29);
ASSIGN_CONST(j_idx, 0);
LABEL(28);
CMP_GOTO(j_idx, n3_idx, 30);
// 读取c[i][k]并输出
MUL(addr_idx, i_idx, n3_idx);
ADD(addr_idx, addr_idx, j_idx);
ADD(addr_idx, addr_idx, c_base);
cout << "M[S[" << val_idx << "]]=M[S[" << addr_idx << "]];" << endl;
WRITE(val_idx);
ADD(j_idx, j_idx, 8);
GOTO(28);
LABEL(30);
ADD(i_idx, i_idx, 8);
GOTO(27);
LABEL(29);
// 7. 退出程序
EXIT();
return 0;
}
全部评论 1
1.有些库Dev才有
2.有些Dev语法在ACGO是UB
3.部分宏在ACGO不支持
4.Linux中的函数与Windows的Dev不兼容,大部分OJ使用的是Linux编译4天前 来自 广东
0


















有帮助,赞一个