题意:给出一段表方向的字符串,u、d、l、r分别表示向上、向下、向左、向右,让你重新排列,使其走出去再回到原点,除了原点能走两次以外其他点都只能走一次,输 出走的次数和走法。
思路:最简单的走法:就是绕一圈,先全是上,再全是右,全是下,全是左,即上的次数==下的次数,左的次数==右的次数,求两组对应方向的较小值,两值之和的两倍 即是走的次数。
有一个方向出现次数是0,则对应的反方向则也为0,另外两个方向就只能各一个,例如:上出现次数是0,则只有一种情况,向左走,再向右走回原点,结束。
#include<stdio.h> #include<algorithm> #include<string.h> #include<math.h> using namespace std; int main(){ int q,l,r,u,d,hmin,smin,i; char a[int(1e5+5)]; while(~scanf("%d%*c",&q)){ while(q--){ gets(a); l=r=u=d=0; for(i=0;a[i]!=‘\0‘;i++){ if(a[i]==‘U‘) u++; if(a[i]==‘D‘) d++; if(a[i]==‘L‘) l++; if(a[i]==‘R‘) r++; } if(u==0||d==0){ if(l!=0&&r!=0){ printf("2\n"); printf("LR"); }else printf("0"); }else if(l==0||r==0){ if(u!=0&&d!=0){ printf("2\n"); printf("UD"); }else printf("0"); }else{ if(u>d) smin=d; else smin=u; if(l>r) hmin=r; else hmin=l; printf("%d\n",2*(smin+hmin)); for(i=0;i<smin;i++) printf("U"); for(i=0;i<hmin;i++) printf("R"); for(i=0;i<smin;i++) printf("D"); for(i=0;i<hmin;i++) printf("L"); } printf("\n"); } } }
原文地址:https://www.cnblogs.com/DreamingBetter/p/12189445.html
时间: 2024-11-06 11:42:29