简单测了一下,发现数据中的 f 可能有问题,过程如下:
搓一个 validator:
#include <algorithm>
#include <cctype>
#include <charconv>
#include <iostream>
using namespace std;
void validate_and_init(int& a, int& b, char& c, int& f) {
string s;
getline(cin, s);
const char* ptr = s.data();
{ // a
auto [ptr2, ec]{from_chars(ptr, ptr + 3, a)};
if (ec != std::errc()) exit(__LINE__);
if (3 > a || a > 100) exit(__LINE__);
ptr = ptr2;
}
if (*ptr++ != ' ') exit(__LINE__);
{ // b
auto [ptr2, ec]{from_chars(ptr, ptr + 3, b)};
if (ec != std::errc()) exit(__LINE__);
if (5 > b || b > 100) exit(__LINE__);
ptr = ptr2;
}
if (*ptr++ != ' ') exit(__LINE__);
if (!isgraph(c = *ptr++)) exit(__LINE__);
if (*ptr++ != ' ') exit(__LINE__);
{ // f
auto [ptr2, ec]{from_chars(ptr, ptr + min(3, int((ptrdiff_t)s.size() - (ptr - s.data()))), f)};
if (ec != std::errc()) exit(__LINE__);
if (0 > f || f > 100) exit(__LINE__);
ptr = ptr2;
if ((ptr - s.data()) != (ptrdiff_t)s.size()) exit(__LINE__);
}
}
int main() {
int a, b, f;
char c;
validate_and_init(a, b, c, f);
int i, j;
for (i = 1; i <= a; ++i, putchar('\n'))
for (j = 1; j <= b; ++j)
putchar((i != 1 && i != a && j != 1 && j != b && !f) ? ' ' : c);
}
结果见 https://www.luogu.com.cn/record/140364995,可以发现 RE 的数据点均是在第 33 行出的问题,说明 f 有问题。
看一下错误码:
#include <algorithm>
#include <cctype>
#include <charconv>
#include <iostream>
using namespace std;
void validate_and_init(int& a, int& b, char& c, int& f) {
string s;
getline(cin, s);
const char* ptr = s.data();
{ // a
auto [ptr2, ec]{from_chars(ptr, ptr + 3, a)};
if (ec != std::errc()) exit(__LINE__);
if (3 > a || a > 100) exit(__LINE__);
ptr = ptr2;
}
if (*ptr++ != ' ') exit(__LINE__);
{ // b
auto [ptr2, ec]{from_chars(ptr, ptr + 3, b)};
if (ec != std::errc()) exit(__LINE__);
if (5 > b || b > 100) exit(__LINE__);
ptr = ptr2;
}
if (*ptr++ != ' ') exit(__LINE__);
if (!isgraph(c = *ptr++)) exit(__LINE__);
if (*ptr++ != ' ') exit(__LINE__);
{ // f
auto [ptr2, ec]{from_chars(ptr, ptr + min(3, int((ptrdiff_t)s.size() - (ptr - s.data()))), f)};
if (ec != std::errc()) exit(int(ec));
if (0 > f || f > 100) exit(__LINE__);
ptr = ptr2;
if ((ptr - s.data()) != (ptrdiff_t)s.size()) exit(__LINE__);
}
}
int main() {
int a, b, f;
char c;
validate_and_init(a, b, c, f);
int i, j;
for (i = 1; i <= a; ++i, putchar('\n'))
for (j = 1; j <= b; ++j)
putchar((i != 1 && i != a && j != 1 && j != b && !f) ? ' ' : c);
}
结果见 https://www.luogu.com.cn/record/140365169,查表可知错误码是 std::errc::invalid_argument,说明 RE 的数据点对应的 f 不是整数。
另外关于 https://www.luogu.com.cn/discuss/748831 中提到的三种改正方法,不难发现使用 1,3 时 f 的值为 0,而第二种方法在 GCC < 13 时可行,因为 GCC < 13 时 include iostream 会进行默认初始化(https://godbolt.org/z/Ys5bP7xdz),而 GCC >= 13 则不会(https://godbolt.org/z/j8Env3Pbh)。
综上所述,我认为该题目的数据有误。