【CF1327C】Game with Chips(构造)
题目大意:
给出一个\(n\)行\(m\)列的地图,地图上存在\(k\)个点需要分别经过其各自的目标位置,你能执行\(2nm\)次以内的操作,每次操作将地图中所有不会出界的点移动一格(上、下、左、右)。求出需要操作的步骤。\((1\le n,m,k\le 200)\)
无论这\(k\)个点在什么位置,都可以通过以下步骤达到目标:
-
将所有点移动到其所在列的最上边,这最多需要向上移动\(n-1\)次。
-
将所有点移动到位置\((1,1)\),这最多需要向左移动\(m-1\)次。
-
将所有点从\((1,1)\)开始遍历整个地图,这需要\(nm-1\)次操作
所以操作次数为\(nm+n+m-3\)次。
因为\(2nm-(nm+n+m-3)\)
\(=nm-n-m+3\)
\(=(n-1)(m-1)+2\ge 2\ge 0\)
所以\(2nm\ge nm+n+m-3\),以上方案符合题意。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,k;
ll sx[200+10],sy[200+10],fx[200+10],fy[200+10];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m >> k;
for(ll i=1;i<=k;i++)cin >> sx[i] >> sy[i];
for(ll i=1;i<=k;i++)cin >> fx[i] >> fy[i];
cout << m*n+n+m-2 << endl;
for(ll i=1;i<n;i++)cout << 'U' ;
for(ll i=1;i<m;i++)cout << 'L' ;
for(ll i=1;i<=n;i++){
for(ll j=1;j<=m;j++){
if(j==m)cout << 'D' ;
else if(i%2==1)cout << 'R' ;
else cout << 'L' ;
}
}
return 0;
}