参照 SYZOJ 的帮助,该文件命名为 spj_cpp17.cpp
。
#include <iostream>
#include <fstream>
using namespace std;
int b[4][4];
int x0, y0;
int main()
{
string ans;
fstream ansin("answer", ios_base::in); // 另一种文件输入输出方式,以这个为例,意思为以只读模式打开文件 “answer”
if (!ansin.good()) { // 像这种是以防万一 HYOI 出 bug(不是
cout << 0; // 测试点得分向标准输出流发送(stdout)
cerr << "ERROR: Couldn't open file \"answer\"."; // 提示信息向标准错误流(stderr)发送,cerr 可以执行这个操作
return 0;
}
ansin >> ans; // 输入本题的标准答案(废话
int len = ans.length(); // 记录下长度,用来和用户输出比较
fstream usrin("user_out", ios_base::in);
if (!usrin.good()) {
cout << 0;
cerr << "ERROR: Couldn't open file \"user_out\".";
return 0;
}
string usr;
usrin >> usr;
if (usr.length() != len) { // 如果长度不一样直接 Wrong Answer
cout << 0;
cerr << "Wrong Answer: File user_out length and answer length differ.";
return 0;
}
usrin.close(), ansin.close();
// 如果用户输出和答案完全一致那就是 Accepted,另外也是考虑 “unsolvable” 的情况
if (usr == ans) {
cerr << "Accepted: Same with answer.";
cout << 100;
return 0;
}
fstream qin("input", ios_base::in);
if (!qin.good()) {
cout << 0;
cerr << "ERROR: Couldn't open file \"input\".";
return 0;
}
// 输入问题初态
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 3; j++) {
char t;
qin >> t;
if (t == 'x') {
b[i][j] = 0;
x0 = i;
y0 = j;
}
else
b[i][j] = t - '0';
}
}
qin.close();
// 进行模拟
for (char c : usr) {
if (c == 'u') {
swap(b[x0][y0], b[x0 - 1][y0]);
x0--;
}
else if (c == 'd') {
swap(b[x0][y0], b[x0 + 1][y0]);
x0++;
}
else if (c == 'l') {
swap(b[x0][y0 - 1], b[x0][y0]);
y0--;
}
else if (c == 'r') {
swap(b[x0][y0 + 1], b[x0][y0]);
y0++;
}
else {
cout << 0;
cerr << "Wrong Answer: Invalid operation.";
return 0;
}
}
int a[4][4] = {
{0, 0, 0, 0},
{0, 1, 2, 3},
{0, 4, 5, 6},
{0, 7, 8, 0}
};
// 如果模拟完得到的答案与问题终态相同,就是 Accepted,否则 Wrong Answer
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 3; j++) {
if (b[i][j] != a[i][j]) {
cerr << "Wrong Answer: Incorrect operation.\n";
cout << 0;
return 0;
}
}
}
cerr << "Accepted: Correct Operation.";
cout << 100;
return 0;
}