题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5402
题意:见 https://vjudge.net/problem/HDU-5402
题解:
如果 n m 其中有一个奇数,那么一定可以到达,输出就可以了。
否则 我们不妨以(1,1) (n,m) 为黑色,将该棋盘黑白格染色,我们可以发现,必定有一个白格子没有走到,我们让最小权值白格子不走到即可
比较麻烦,实现过程细节很多,详见代码。
这题没看着多组数据WA了4次,多组数据 n,m 判奇数后直接return 0 WA了1次。。
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <map> // STL
#include <string>
#include <vector>
#include <queue>
#include <stack>
#define mpr make_pair
#define debug() puts("okkkkkkkk")
using namespace std;
typedef long long LL;
const int inf = 1 << 26;
int n, m, sum = 0, tmpmx = inf, x, y;
int matr[2005][2005];
void init() { tmpmx = inf; x = 0; y = 0; sum = 0; memset(matr, 0, sizeof(matr)); }
int main(){
// freopen("ACM-A.in", "r", stdin);
while( scanf("%d %d", &n, &m) != EOF ) {
init();
for ( int i = 1; i <= n; i ++ ) {
for ( int j = 1; j <= m; j ++ ) {
scanf("%d", &matr[i][j]);
sum += matr[i][j];
if((i+j)&1 && matr[i][j] < tmpmx) { tmpmx = matr[i][j]; x = i; y = j; }
}
}
if( n&1 || m&1 ) {
printf("%d\n", sum);
if( n&1 ) {
for ( int i = 1; i < n; i += 2) {
for ( int j = 1; j < m; j ++ ) printf("R");
printf("D");
for ( int j = 1; j < m; j ++ ) printf("L");
printf("D");
}
for ( int j = 1; j < m; j ++ ) printf("R");
} else {
for ( int i = 1; i < m; i += 2) {
for ( int j = 1; j < n; j ++ ) printf("D");
printf("R");
for ( int j = 1; j < n; j ++ ) printf("U");
printf("R");
}
for ( int j = 1; j < n; j ++ ) printf("D");
}
puts("");
continue;
}
int fg = 1;
printf("%d\n", sum-matr[x][y]);
for ( int i = 1; i <= n; i += 2 ) {
if(x == i || x == i+1 ) {
for ( int j = 1; j < y; j ++ ) {
if(j&1) printf("D");
else printf("U");
printf("R");
}
if(y < m) printf("R");
for ( int j = y+1; j <= m; j ++ ) {
if(j&1) printf("U");
else printf("D");
if(j != m) printf("R");
}
if(i < n-1) printf("D");
fg = 0;
} else if(fg) {
for ( int j = 1; j < m; j ++ ) printf("R");
printf("D");
for ( int j = 1; j < m; j ++ ) printf("L");
printf("D");
} else if(!fg) {
for ( int j = 1; j < m; j ++ ) printf("L");
printf("D");
for ( int j = 1; j < m; j ++ ) printf("R");
if(i < n-1) printf("D");
}
}
puts("");
}
return 0;
}