题意:有四种命令:U代表上移一个单位,D代表下移一个单位,R代表右移一个单位,L代表左移一个单位。
现在给出一串命令,问怎样修改命令中的任意一条命令,使得命令结束后重新返回原点,并且修改的步数最少。
思路:把问题抽象化,统计四中命令各自有多少,之后D与U相互抵消(numD-numU),R与L相互抵消(numR-numL),将两个差值的绝对值相加之后除以二就是结果。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void f(int *x,int *y){
 if(*x>=*y){
 (*y)++;
 }
 if(*x<*y){
 (*x)++;
 }
 }
void g(int *x,int *y){
 if(*x>=*y){
 (*x)--;
 }
 if(*x<*y){
 (*y)--;
 }
 }
int main(){
 char str[100500];
 gets(str);
 int i,len=strlen(str),l=0,r=0,d=0,u=0;
 int rslt=0;
 if(len%2!=0){
 printf("-1\n");
 return 0;
 }
 else for(i=0;i<len;i++){
 if(str[i]=='L')l ++ ;
 if(str[i]=='R')r ++;
 if(str[i]=='U')u++;
 if(str[i]=='D')d++;
 }
 if((l+r)%2!=0){
 f(&l,&r);
 g(&u,&d);
 rslt++;
 }
 rslt+=(abs(l-(l+r)/2)+abs(u-(d+u)/2));
 printf("%d\n",rslt);
 return 0;
}
void函数是判断l+f 是奇数时,将其换成偶数 而不增加补数
这是通过的代码 ,但起初结果死活不对 后来发现是因为函数中写的是*x++ 而++的优先级是比*高的,自然就不对了
but,看了别人才发现完全不用这么复杂好吧
如果l+f为奇数结果会在偶数的基础上增加一步,而 rslt+=(abs(l-(l+r)/2)+abs(u-(d+u)/2))的值此时也加一,所以判断奇数偶数完全没有必要, 结果是一样的
改进后
#include <stdio.h> #include <string.h> #include <stdlib.h>int main(){char str[100500];gets(str);int i,len=strlen(str),l=0,r=0,d=0,u=0;int rslt=0;if(len%2!=0){printf("-1\n");return 0;}else for(i=0;i<len;i++){if(str[i]=='L')l ++ ;if(str[i]=='R')r ++;if(str[i]=='U')u++;if(str[i]=='D')d++;}rslt+=(abs(l-(l+r)/2)+abs(u-(d+u)/2));printf("%d\n",rslt);return 0;