Educational Codeforces Round 84 (Rated for Div. 2) 比赛人数13522
[codeforces 1327C] Game with Chips 有点象飞行棋
总目录详见https://blog.csdn.net/mrcrack/article/details/103564004
也在线测评地址https://codeforces.ml/contest/1327/problem/C
Problem | Lang | Verdict | Time | Memory |
---|---|---|---|---|
C - Game with Chips | GNU C++11 | Accepted | 15 ms | 0 KB |
有点象飞行棋,故题意读起来比较顺利。
因题目反复暗示不超过2*n*m步,故有了基本思路,
先让所有棋子,移到棋盘的左上角(此种情况最多花费步数n-1+m-1),
再让所有棋子一块从左上角开始,遍历所有棋盘格子,到达棋盘的右下角(此种情况最多花费步数(m-1)*n+n-1),
总步数n-1+m-1+(m-1)*n+n-1<2*n*m
遍历过程如图所示:
注意该题,没有输出-1的情况,所有格子均能在2*n*m步内完成。
AC代码如下
#include <cstdio>
#include <algorithm>
using namespace std;
char cmd[80010];
int x[205],y[205],X,Y;
int main(){
int n,m,k,i,a,b,len,j;
scanf("%d%d%d",&n,&m,&k);
for(i=1;i<=k;i++){
scanf("%d%d",&x[i],&y[i]);
X=max(X,x[i]),Y=max(Y,y[i]);//记录离左上角格子,最远的行位置,最远列位置。
}
for(i=1;i<=k;i++)scanf("%d%d",&a,&b);//读取需要到达的格子位置,读完就丢弃,因不影响结果
X--,Y--;
for(i=1;i<=X;i++)cmd[i]='U';//棋子回归左上角
for(i=1;i<=Y;i++)cmd[X+i]='L';//棋子回归左上角
len=X+Y;
for(i=0;i<n;i++){//棋子从左上角出发,遍历所有格子,到达右下角
for(j=0;j<m-1;j++){
if(i%2==0)cmd[++len]='R';//偶数行,棋子向右动
else cmd[++len]='L';//奇数行,棋子向左动
}
if(i!=n-1)cmd[++len]='D';//从上一行到下一行,棋子向下动
}
cmd[len+1]=0;//设置字符串结束
printf("%d\n",len);
printf("%s\n",cmd+1);
}