Special Judge 程序

Laffey 2022-03-10 20:35:56

参照 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;
}