csu1510(规律)
来源:互联网 发布:浙江儿童dna数据库利弊 编辑:程序博客网 时间:2024/06/05 15:33
题意:从(0,0)开始在坐标上移动,问x,y分别可以移动到的位置的最小值和最大值,有四种移动方式:
F:在当前面对的方向移动一格,一共四个方向,自然是坐标轴的上下左右四个方向,这代表着每次只有x变化或者只有y变化
L:当前方向向左转90度,比如面对着x轴正方向转为y轴正方向
R:向右转90度
?:这个代表着这个命令由你定,你可以执行上述三个命令中任何一个,当然为了得到极值选哪个命令就是这道题的关键了
一开始用了dfs做,超时,想想有1000个字符,自然会超时
隔了一天想到其实当前在处理某个字符,并不用考虑除了前一个字符之外的字符是什么选择
假设四个方向分别用0,1,2,3代替
假设现在是求x的最大值
例如对于第一个字符是?,第二个字符L,那么第二个字符只考虑可以由第一个字符得到什么,如果第一个字符可以是0方向,那么第二个字符就可以是3方向了,如果第一个字符的0方向有值a,那么第二个字符由第一个字符左转得到,自然值就为a
如果当前处理的字符为?,那就是三种选择,比如对于0方向,上个字符0,1,3方向有值,那么x_next_max[0]=max(x[0],x[1],x[2])
我一开始觉得很头痛的是处理问号的时候怎么判断对后面的影响来获得最大值,其实只要记录当前每个方向是否可以成立就好了
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
#define IMAX 1000005
using namespacestd;
char ch[1005];
int len;
//int xin[4],xax[4],yin[4],yax[4];
int max(int a,int b,int c)
{
if(a<b)
a=b;
if(a>c)
return a;
return c;
}
int min(int a,int b,int c)
{
if(a>b)
a=b;
if(a<c)
return a;
return c;
}
void chang(int *s,int f)
{
if(f==2)
{
int tep=s[0];
s[0]=s[1];
s[1]=s[2];
s[2]=s[3];
s[3]=tep;
}
if(f==1)
{
int tep=s[0];
s[0]=s[3];
s[3]=s[2];
s[2]=s[1];
s[1]=tep;
}
}
int main()
{
int tt=1;
while(scanf("%s",ch)!=EOF)
{
len=strlen(ch);
int xax[4]={0,-IMAX,-IMAX,-IMAX};
int xin[4]={0,IMAX,IMAX,IMAX};
int yax[4]={0,-IMAX,-IMAX,-IMAX};
int yin[4]={0,IMAX,IMAX,IMAX};
int t[4];
for(int i=0;i<len;i++)
{
if(ch[i]=='L')
{
chang(xax,1);
chang(xin,1);
chang(yax,1);
chang(yin,1);
}
elseif(ch[i]=='R')
{
chang(xax,2);
chang(xin,2);
chang(yax,2);
chang(yin,2);
}
elseif(ch[i]=='F')
{
if(xax[0]!=-IMAX)
xax[0]++;
if(xax[2]!=-IMAX)
xax[2]--;
if(xin[0]!=IMAX)
xin[0]++;
if(xin[2]!=IMAX)
xin[2]--;
if(yax[1]!=-IMAX)
yax[1]++;
if(yax[3]!=-IMAX)
yax[3]--;
if(yin[1]!=IMAX)
yin[1]++;
if(yin[3]!=IMAX)
yin[3]--;
}
else
{
t[0]=max(xax[0]+1,xax[1],xax[3]);
t[1]=max(xax[1],xax[0],xax[2]);
t[3]=max(xax[3],xax[0],xax[2]);
t[2]=max(xax[2]-1,xax[1],xax[3]);
memcpy(xax,t,16);
if(xin[2]!=IMAX)
t[2]=min(xin[2]-1,xin[1],xin[3]);
else
t[2]=min(xin[2],xin[1],xin[3]);
t[1]=min(xin[1],xin[0],xin[2]);
t[3]=min(xin[3],xin[0],xin[2]);
t[0]=min(xin[0]+1,xin[1],xin[3]);
memcpy(xin,t,16);
if(yax[1]!=-IMAX)
t[1]=max(yax[1]+1,yax[0],yax[2]);
else
t[1]=max(yax[1],yax[0],yax[2]);
t[0]=max(yax[0],yax[1],yax[3]);
t[2]=max(yax[2],yax[1],yax[3]);
t[3]=max(yax[3]-1,yax[0],yax[2]);
memcpy(yax,t,16);
if(yin[3]!=IMAX)
t[3]=min(yin[3]-1,yin[0],yin[2]);
else
t[3]=min(yin[3],yin[0],yin[2]);
t[0]=min(yin[0],yin[1],yin[3]);
t[2]=min(yin[2],yin[1],yin[3]);
t[1]=min(yin[1]+1,yin[0],yin[2]);
memcpy(yin,t,16);
}
/*printf("%d %d %d %d\n",xin[0],xin[1],xin[2],xin[3]);
printf("%d %d %d %d\n",xax[0],xax[1],xax[2],xax[3]);
printf("%d %d %d %d\n",yin[0],yin[1],yin[2],yin[3]);
printf("%d %d %d %d\n",yax[0],yax[1],yax[2],yax[3]);*/
}
printf("Case %d: ",tt);
tt++;
xax[0]=max(max(xax[1],xax[2],xax[2]),xax[0],xax[3]);
xin[2]=min(min(xin[0],xin[1],xin[1]),xin[3],xin[2]);
yin[3]=min(min(yin[0],yin[1],yin[1]),yin[2],yin[3]);
yax[1]=max(max(yax[0],yax[2],yax[2]),yax[3],yax[1]);
printf("%d %d %d %d\n",xin[2],xax[0],yin[3],yax[1]);
}
return0;
}
/*********************若是真的比赛我这种第二天才想出来的肯定就gg了,希望天赐我一些聪明才智
- csu1510(规律)
- csu1510: Happy Robot
- csu1510 Happy Robot 递推
- 规律!
- 规律
- hdu6154 规律啊规律
- 百度规律
- 找规律
- 如此规律
- 尊重规律
- 薪资规律
- 找规律!
- 整除规律
- 泛数独小规律
- 数独小规律
- 规律总结
- 找规律
- 掌握规律
- Angular4 幕课网
- 正则表达式30分钟入门教程
- 通过Kinect制作体感控制机器人
- github怎样删除项目
- Android 6.0 如何默认打开user版本的root权限
- csu1510(规律)
- Java栈堆内存详解
- set/multiset(集与多集)
- armv6, armv7, armv7s, arm64 的区别
- UVALive5135 [Mining Your Own Business] tarjan求无向图双联通分量
- SpringMVC如何处理Ajax请求和返回Json对象
- Date对象常用属性与方法详解
- hdu 1069 Monkey and Banana (动态规划)
- linux下 signal信号机制的透彻分析与各种实例讲解