#include <bits/stdc++.h>
using namespace std;
inline void train() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
}
constexpr int N = 103, M = 29, INF = 100003;
// Note: starting from 1.
int dp[N][N][M], dpsrc[N][N][M], n, m;
string cache = "";
char sched[N][M];
inline void calculate(int ending) {
int latest_cost = INF-2, latest_pos = -1; // -1: Not available.
for (int i = 1; i <= m; i++) {
if (sched[ending][i] == 'O') {
latest_cost = 0;
latest_pos = i;
break;
}
}
// cerr << "Ending at " << ending << " position " << latest_pos << endl;
for (int i = ending-1; i >= 1; i--) {
// for (int i = n-1; i >= 1; i--) {
for (int j = 1; j <= m; j++) {
if (sched[i][j] == 'X') {
dp[ending][i][j] = INF+1;
dpsrc[ending][i][j] = -1;
continue;
}
int best_val = INF-5, best_from = -1;
for (int k = 1; k <= m; k++) {
int my_val;
if (j == k) {
my_val = dp[ending][i+1][k];
} else {
my_val = dp[ending][i+1][k] + 1;
}
if (my_val < best_val || (best_from == j && my_val == best_val)) {
best_val = my_val;
best_from = k;
}
}
dp[ending][i][j] = best_val;
dpsrc[ending][i][j] = best_from;
// cerr << "Day " << i << " position " << j << " comes from " << dpsrc[ending][i][j] << endl;
}
// }
}
}
int main() {
train();
cin>>n>>m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin>>sched[i][j];
if (sched[i][j] == 'X') for (int k = 1; k <= n; k++) {
dp[k][i][j] = INF;
dpsrc[k][i][j] = -1;
}
}
}
for (int i = 1; i <= n; i++) calculate(i);
int mx,nx,caseid = 1;
bool initial = true;
while (cin>>mx>>nx) {
if (mx == 0 || nx == 0) break;
if (initial) {
initial = false;
} else {
cout << '\n';
}
nx--;
// Get m latest
int latest_cost = INF-2, latest_pos = -1; // -1: Not available.
for (int i = 1; i <= m; i++) {
if (dp[nx][mx][i] < latest_cost) {
latest_cost = dp[nx][mx][i];
latest_pos = i;
}
}
cout << "Case " << caseid << ":\n\n";
if (latest_pos < 0) {
cout << "Not available\n";
caseid++;
continue;
}
// cerr << "Day " << mx << " Select " << latest_pos << " at cost " << latest_cost << endl;
cache = "";
int tracker = dpsrc[nx][mx][latest_pos], former = mx;
bool failed = false;
for (int i = mx+1; i <= nx; i++) {
if (tracker < 0) {
cout << "Not available\n";
failed = true;
break;
}
if (tracker != latest_pos) {
// Put away the former
// cout << (latest_pos - 1 + 'A') << ": " << former << "-" << (i-1) << '\n';
cache += latest_pos - 1 + 'A';
cache += ": ";
cache += to_string(former);
cache += '-';
cache += to_string(i);
cache += '\n';
latest_pos = tracker;
former = i;
}
// cerr << "Day " << i << " Select " << tracker << endl;
tracker = dpsrc[nx][i][latest_pos];
}
if (!failed) {
cout << cache << char(latest_pos - 1 + 'A') << ": " << former << "-" << (nx+1) << '\n';
}
caseid++;
}
cout<<flush;
return 0;
}
对题解对拍也拍不出来