QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#719548 | #514. The Punctilious Cruciverbalist | kevinyang# | WA | 0ms | 3632kb | C++20 | 4.1kb | 2024-11-07 03:30:11 | 2024-11-07 03:30:13 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,a,b) for (int i=a; i < (b); ++i)
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
int R, C;
const int MAXN = 55;
char g[MAXN][MAXN];
bool startA[MAXN][MAXN];
bool startD[MAXN][MAXN];
inline bool inr(int i, int j) {
return i >= 1 && j >= 1 && i <= R && j <= C;
}
inline bool can_letter(int i, int j) {
return inr(i,j) && g[i][j] != '#';
}
struct Clue {
int id;
char dir;
int i;
int j;
int num;
int den;
bool better(const Clue& o) const {
int lhs = num*o.den;
int rhs = den*o.num;
if (lhs != rhs) return lhs > rhs;
if (dir != o.dir) return dir=='A';
return id < o.id;
}
bool operator<(const Clue& o) const {
// a < b if a is worse than b
return !better(o);
}
Clue(int id, char dir, int i, int j) : id(id), dir(dir), i(i), j(j) {}
void eval() {
int ci = i;
int cj = j;
int di = 0;
int dj = 0;
if (dir == 'A') dj = 1;
else di = 1;
string pat = "";
while (can_letter(ci, cj)) {
pat.push_back(g[ci][cj]);
ci += di;
cj += dj;
}
num = 0;
den = 0;
int N = pat.size();
for (int i = 0; i < N; ++i) {
if (pat[i] == '.') {
// no letter
den += N-i;
} else {
// has letter
num += N-i;
den += N-i;
}
}
cout << "EVALED: ";
print();
cout << num << ' ' << den << '\n';
}
bool solved() const {
return num==den;
}
string get_tag() const {
string ret = "";
ret += to_string(id);
ret += string(1, dir);
return ret;
}
void solve() {
int ci = i;
int cj = j;
int di = 0;
int dj = 0;
if (dir == 'A') dj = 1;
else di = 1;
while (can_letter(ci, cj)) {
g[ci][cj] = 'S';
ci += di;
cj += dj;
}
}
void print() {
cout << "clue: " << id << ' ' << dir << ' ' << i << ' ' << j << '\n';
}
};
signed main() {
cin.tie(0)->sync_with_stdio(0);
cin >> R >> C;
for (int i = 1; i <= R; ++i) {
for (int j = 1; j <= C; ++j) {
cin >> g[i][j];
if (g[i][j] >= 'A' && g[i][j] <= 'Z') g[i][j] = 'S';
}
}
for (int i = 1; i <= R; ++i) {
for (int j= 1; j <= C; ++j) {
int pi = i;
int pj = j-1;
if (!inr(pi,pj) || g[pi][pj] == '#') startA[i][j] = 1;
pi = i-1;
pj = j;
if (!inr(pi,pj) || g[pi][pj] == '#') startD[i][j] = 1;
}
}
vector<Clue> clues;
int clue_num = 0;
for (int i = 1; i <= R; ++i) {
for (int j = 1; j <= C; ++j) {
if (g[i][j] == '#') continue;
if (startA[i][j] && startD[i][j]) {
int n = ++clue_num;
clues.push_back(Clue{n, 'A', i, j});
clues.push_back(Clue{n, 'D', i, j});
} else if (startA[i][j]) {
clues.push_back(Clue{++clue_num, 'A', i, j});
} else if (startD[i][j]) {
clues.push_back(Clue{++clue_num, 'D', i, j});
}
}
}
for (Clue& clue : clues) {
clue.print();
}
vector<string> ans;
while (true) {
for (Clue& clue : clues) {
clue.eval();
}
sort(clues.begin(), clues.end());
while (clues.size() && clues.back().solved()) {
clues.pop_back();
}
if (clues.empty()) break;
ans.push_back(clues.back().get_tag());
clues.back().solve();
clues.pop_back();
}
for (const string& a : ans) {
cout << a << '\n';
}
}
/*
4 4
...#
....
JAVA
#...
*/
詳細信息
Test #1:
score: 0
Wrong Answer
time: 0ms
memory: 3632kb
input:
4 4 ...# .... .... #...
output:
clue: 1 A 1 1 clue: 1 D 1 1 clue: 2 D 1 2 clue: 3 D 1 3 clue: 4 A 2 1 clue: 5 D 2 4 clue: 6 A 3 1 clue: 7 A 4 2 EVALED: clue: 1 A 1 1 0 6 EVALED: clue: 1 D 1 1 0 6 EVALED: clue: 2 D 1 2 0 10 EVALED: clue: 3 D 1 3 0 10 EVALED: clue: 4 A 2 1 0 10 EVALED: clue: 5 D 2 4 0 6 EVALED: clue: 6 A 3 1 0 10 EV...
result:
wrong answer 1st lines differ - expected: '1A', found: 'clue: 1 A 1 1'