#include using namespace std; typedef long long INT; const bool DEBUG = false; INT N, M; INT A, C; char field[402][402], tmp[402][402]; INT points[402][402]; bool haveObjects = false; bool vis[402][402]; map > moves; void ReadInput() { if (!DEBUG) { freopen("pinball.in", "r", stdin); freopen("pinball.out", "w", stdout); } INT i, j; cin >> N >> M; cin >> A >> C; for (i = 0; i < N; i++) { cin >> field[i]; for (j = 0; j < M; j++) { if (field[i][j] != '.') { haveObjects = true; } } } for (i = 0; i < N; i++) { for (j = 0; j < M; j++) { cin >> points[i][j]; } } } void getAnswerWithoutObjects() { INT i, j; INT curSum, sum = 0, row; for (i = 0; i < N; i++) { curSum = 0; for (j = 0; j < M; j++) { curSum = curSum + points[i][j]; } if (curSum > sum) { sum = curSum; row = i + 1; } } cout << row << "\n"; for (i = 0; i < N; i++) { cout << field[i] << "\n"; } } bool isOut(pair cur) { if (cur.first < 0) return true; if (cur.first >= N) return true; if (cur.second < 0) return true; if (cur.second >= M) return true; return false; } INT calcRow(INT row) { pair cur; char dist = 'R'; INT sum = 0, minusSum = 0; INT Up, Down, Right, Left; cur = make_pair(row, 0); while (!isOut(cur)) { sum = sum + points[cur.first][cur.second]; if (tmp[cur.first][cur.second] == '.') { if ((dist == 'R') && (cur.second == M - 1)) { minusSum = minusSum + A; Up = cur.first; Down = N - 1 - cur.first; if (Up > Down) { tmp[cur.first][cur.second] = '/'; dist = 'U'; } else { tmp[cur.first][cur.second] = '\\'; dist = 'D'; } } else if ((dist == 'L') && (cur.second == 0)) { minusSum = minusSum + A; Up = cur.first; Down = N - 1 - cur.first; if (Up > Down) { tmp[cur.first][cur.second] = '\\'; dist = 'U'; } else { tmp[cur.first][cur.second] = '/'; dist = 'D'; } } else if ((dist == 'U') && (cur.first == 0)) { minusSum = minusSum + A; Left = cur.second; Right = M - 1 - cur.second; if (Left > Right) { tmp[cur.first][cur.second] = '\\'; dist = 'L'; } else { tmp[cur.first][cur.second] = '/'; dist = 'R'; } } else if ((dist == 'D') && (cur.first == N - 1)) { minusSum = minusSum + A; Left = cur.second; Right = M - 1 - cur.second; if (Left > Right) { tmp[cur.first][cur.second] = '/'; dist = 'L'; } else { tmp[cur.first][cur.second] = '\\'; dist = 'R'; } } } else { if (!vis[cur.first][cur.second]) { if (dist == 'R') { Up = cur.first; Down = N - 1 - cur.first; if (Up > Down) { dist = 'U'; if (tmp[cur.first][cur.second] != '/') { minusSum = minusSum + C; tmp[cur.first][cur.second] = '/'; } } else { dist = 'D'; if (tmp[cur.first][cur.second] != '\\') { minusSum = minusSum + C; tmp[cur.first][cur.second] = '\\'; } } } else if (dist == 'L') { Up = cur.first; Down = N - 1 - cur.first; if (Up > Down) { dist = 'U'; if (tmp[cur.first][cur.second] != '\\') { minusSum = minusSum + C; tmp[cur.first][cur.second] = '\\'; } } else { dist = 'D'; if (tmp[cur.first][cur.second] != '/') { minusSum = minusSum + C; tmp[cur.first][cur.second] = '/'; } } } else if (dist == 'U') { Left = cur.second; Right = M - 1 - cur.second; if (Left > Right) { dist = 'L'; if (tmp[cur.first][cur.second] != '\\') { minusSum = minusSum + C; tmp[cur.first][cur.second] = '\\'; } } else { dist = 'R'; if (tmp[cur.first][cur.second] != '/') { minusSum = minusSum + C; tmp[cur.first][cur.second] = '/'; } } } else { Left = cur.second; Right = M - 1 - cur.second; if (Left > Right) { dist = 'L'; if (tmp[cur.first][cur.second] != '/') { minusSum = minusSum + C; tmp[cur.first][cur.second] = '/'; } } else { dist = 'R'; if (tmp[cur.first][cur.second] != '\\') { minusSum = minusSum + C; tmp[cur.first][cur.second] = '\\'; } } } } } vis[cur.first][cur.second] = true; cur.first = cur.first + moves[dist].first; cur.second = cur.second + moves[dist].second; } sum = sum - minusSum; if (sum < 0) sum = 0; return sum; } void init() { moves.clear(); moves['L'] = make_pair(0, -1); moves['U'] = make_pair(-1, 0); moves['R'] = make_pair(0, 1); moves['D'] = make_pair(1, 0); } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); INT i; INT pointsOnRow, maxPoints = 0, row; char ansField[402][402]; init(); ReadInput(); if (!haveObjects) { getAnswerWithoutObjects(); return 0; } for (i = 0; i < N; i++) { memset(vis, false, sizeof(vis)); memcpy(tmp, field, sizeof(field)); pointsOnRow = calcRow(i); if (pointsOnRow >= maxPoints) { maxPoints = pointsOnRow; row = i + 1; memcpy(ansField, tmp, sizeof(tmp)); } } cout << row << "\n"; for (i = 0; i < N; i++) { cout << ansField[i] << "\n"; } return 0; }