P4874 回形遍历 —模拟
思路:
写完后信心满满,结果超时。
我很不解,下了个数据结果——,z竟然是大于1e10的,跟题目给的不一样啊
原来如此,正解是一行一行的走的。。。
注意当到两边一样近时,应优先向下和右!!!!!!
这是个50分代码
#include<iostream> #include<queue> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; #define N 100009 int n,m,x,y,z; int deep,dir; int dx[4]={1,0,-1,0},dy[5]={0,1,0,-1}; int main() { scanf("%d%d%d%d%d",&n,&m,&x,&y,&z); deep=min(x,y);deep=min(deep,min(n-x,m-y)); if(deep==x) dir=4; if(deep==y) dir=1; if(deep==(n-x)) dir=2; if(deep==(m-y)) dir=3; dir--;n--,m--; for(int i=1;i<=z;i++) { if(x+dx[dir]>=deep&&y+dy[dir]>=deep&&x+dx[dir]<=n-deep&&y+dy[dir]<=m-deep) x+=dx[dir],y+=dy[dir]; else { dir=(dir+1)%4; x+=dx[dir],y+=dy[dir]; } } printf("%d %d",x,y); return 0; }
这是个AC代码
#include<iostream> #include<queue> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; long long n,m,x,y,z; long long deep,dir,len; int main() { scanf("%lld%lld%lld%lld%lld",&n,&m,&x,&y,&z);n--,m--; deep=min(x,y);deep=min(deep,min(n-x,m-y)); if(deep==(m-y)) dir=3; if(deep==x) dir=4; if(deep==y) dir=1; if(deep==(n-x)) dir=2; if(x==(n-x)&&x==deep) dir=2; if(y==(m-y)&&y==deep) dir=1; dir--; while(z+1>=0) { if(dir==0) { len= n-x-deep; if(z>len) { z-=len; x+=len; dir=1; }else { printf("%lld %lld",x+z,y); return 0; } }else if(dir==1) { len=m-y-deep; if(z>len) { z-=len; y+=len; dir=2; }else { printf("%lld %lld",x,y+z); return 0; } }else if(dir==2) { len=x-deep; if(z>len) { z-=len;x=deep; dir=3; }else { printf("%lld %lld",x-z,y); return 0; } }else if(dir==3) { deep++; len=y-deep; if(z>len) { z-=len;y=deep; dir=0; }else { printf("%lld %lld",x,y-z); return 0; } } } return 0; }