大毒瘤实现题......
#include<bits/stdc++.h> using namespace std; long long n,m,k,all; vector< pair< int , string > >v1,v2; void cal(){ for(int i=0;i<v2.size();i++){ v1.push_back(v2[i]); } } int main(){ cin>>n>>m>>k; if(4*n*m-2*n-2*m<k){ cout<<"NO"<<endl; exit(0); } if(n==1){ cout<<"YES"<<endl; cout<<k<<endl; string ppp; for(int i=0;i<m-1;i++){ ppp=ppp+"R"; } for(int i=0;i<m-1;i++){ ppp=ppp+"L"; } ppp.resize(k); for(int i=0;i<k;i++)cout<<1<<" "<<ppp[i]<<endl; exit(0); } else if(m==1){ cout<<"YES"<<endl; cout<<k<<endl; string ppp; for(int i=0;i<n-1;i++){ ppp=ppp+"D"; } for(int i=0;i<n-1;i++){ ppp=ppp+"U"; } ppp.resize(k); for(int i=0;i<k;i++)cout<<1<<" "<<ppp[i]<<endl; exit(0); } all=0; for(int i=1;i<=n;i++){ if(i==1){ v1.push_back(make_pair(m-1,"R")); v1.push_back(make_pair(m-1,"L")); v1.push_back(make_pair(1,"D")); all=all+2*(m-1)+1; } else if(i==n){ v1.push_back(make_pair(m-1,"R")); v1.push_back(make_pair(m-1,"UDL")); v1.push_back(make_pair(n-1,"U")); all=all+4*(m-1)+(n-1); } else{ v1.push_back(make_pair(m-1,"R")); v1.push_back(make_pair(m-1,"UDL")); v1.push_back(make_pair(1,"D")); all=all+4*(m-1)+1; } } while(all>k){ string pp=v1.back().second; string zzz; long long tmp=v1.back().second.size(); long long cishu=v1.back().first; v1.pop_back(); if(all-tmp*cishu>k){ all-=tmp*cishu; continue; } all-=tmp*cishu; long long cur=k-all; v2.clear(); if(cur>=tmp)v2.push_back(make_pair(cur/tmp,pp)); if((cur%tmp)==0)break; for(int i=0;i<cur%tmp;i++)zzz=zzz+pp[i]; v2.push_back(make_pair(1,zzz)); } cal(); cout<<"YES"<<endl; cout<<v1.size()<<endl; for(int i=0;i<v1.size();i++){ cout<<v1[i].first<<" "<<v1[i].second<<endl; } }
嘛,考虑怎么(最简单的)走最多,然后判断一下答案,然后输出路径就好了
思想很简单....
但我当时打的时候没实现出来.....
自闭....(被C搞到自闭,最后只剩30+分钟)(然后一直再想着缩圈......(wtsl))
.....