题目链接
思路:这题感觉比C题简单啊,但是码量不够,花了一个多小时在debug,幸好最后一分钟的时候AC了。。。如题:我们是一定能够找到一条路径能够不重复的走完所有路的,那么该怎么走呢,看下面
我是按这种方式不重复的走完所有路的,只要一开始把所有的路构造出来,看看k到哪里就可以了,有个需要注意的店就是n或者m为1的时候注意一下,其他都是细节问题,至于代码将就看看吧,这个debug当时几乎搞得我精疲力竭,也实在没功夫把代码修饰一下,变量名什么都取得很随意了,关键还是构造路径那个地方。
#include<bits/stdc++.h>
using namespace std;
const int maxn=510;
typedef long long ll;
vector<pair<int,string>>ans,ans1;
map<string,int>p;
vector<char>temp;
vector<string>v;
int n,m,k,cnt=0;
int main()
{
scanf("%d%d%d",&n,&m,&k);
if((4*n*m-2*n-2*m)<k) {
puts("NO");return 0;
}
puts("YES");
for(int i=1;i<=m-1;++i) temp.push_back('R');
for(int i=1;i<=m-1;++i) temp.push_back('L');
cnt=2*(m-1);
for(int i=1;i<n;++i)
{
if(cnt<k) temp.push_back('D'),cnt++;
for(int j=1;j<m;++j)
{
if(cnt<k) temp.push_back('R'),cnt++;
if(cnt<k) temp.push_back('U'),cnt++;
if(cnt<k) temp.push_back('D'),cnt++;
}
for(int j=1;j<m;++j) if(cnt<k) temp.push_back('L'),cnt++;
}
for(int i=1;i<n;++i) if(cnt<k) temp.push_back('U'),cnt++;
if(m>1) ans.push_back({m-1,"R"});
if(m>1) ans.push_back({m-1,"L"});
for(int i=1;i<=n-1;++i)
{
if(m>1)ans.push_back({m-1,"DRU"});
ans.push_back({1,"D"});
if(m>1)ans.push_back({m-1,"L"});
}
if(n>1)ans.push_back({n-1,"U"});
ll sum=0;
for(int i=0;i<ans.size();++i)
{
int t1=ans[i].first,t2=ans[i].second.size();
if(sum+(t1*t2)>=k) {
int num5=(k-sum)/t2;
int num6=(k-sum-(t2*num5))%t2;
if(num5!=0) ans1.push_back({num5,ans[i].second});
if(num6!=0)
{
string s2,ss=ans[i].second;
for(int j=0;j<num6;++j) s2+=ss[j];
ans1.push_back({1,s2});
}
break;
}
sum+=t1*t2;
ans1.push_back({ans[i].first,ans[i].second});
}
cout<<ans1.size()<<endl;
for(int i=0;i<ans1.size();++i) cout<<ans1[i].first<<" "<<ans1[i].second<<endl;;
}