#include <iostream>
#include <vector>
using namespace std;
int a[1145][1419];
int main() {
auto small = [&](vector<pair<char, pair<int, int> > > x, vector<pair<char, pair<int, int> > > y) -> bool{
if (x.size() != y.size()) return x.size() < y.size();
int len = x.size();
for (int i = 0; i < len; ++i) {
if (x[i].second.first != y[i].second.first) return x[i].second.first < y[i].second.first;
}
return 0;
};
auto Getnum = [&]() {
char c = getchar();
while (c != 'X' && c != 'O') c = getchar();
return c == 'O';
};
int n, m;
for (int _ = 1; ; ++_) {
scanf("%d%d", &n, &m);
if (!(n || m)) break;
if (_ != 1) puts("");
vector<vector<vector<pair<char, pair<int, int> > > > > dp(n + 1, vector<vector<pair<char, pair<int, int> > > >(m + 1));
for (int i = 1; i <= n; ++i) for (int j = 1; j <= m; ++j) a[i][j] = Getnum();
int x, y;
scanf("%d%d", &x, &y);
for (int i = 1; i <= m; ++i) if (a[x][i] == 1) dp[x][i].push_back({i + 'A' - 1, {x, x}});
for (int i = x + 1; i <= y; ++i)
for (int j = 1; j <= m; ++j) {
if (a[i][j] == 0) continue;
for (int k = 1; k <= m; ++k) {
if (a[i - 1][k] == 1) {
if (j == k) {
if (dp[i][j].empty() || dp[i][j].size() > dp[i - 1][j].size()) {
dp[i][j] = dp[i - 1][j];
pair<char, pair<int, int> > bk = dp[i][j].back();
dp[i][j].pop_back();
bk.second.second++;
dp[i][j].push_back(bk);
}
} else {
if (dp[i][j].empty() || dp[i][j].size() - 1 > dp[i - 1][k].size()) {
dp[i][j] = dp[i - 1][k];
dp[i][j].push_back({k + 'A' - 1, {j, j}});
}
}
}
}
}
int ans = 0;
for (int i = 1; i <= m; ++i) {
if (a[y][i]) {
if (ans == 0 || small(dp[y][i], dp[y][ans])) {
ans = i;
}
}
}
printf("Case %d:\n\n", _);
for (const auto & i : dp[y][ans]) {
printf("%c: %d-%d\n", i.first, i.second.first, i.second.second);
}
}
return 0;
}
题目,样例不输出。


