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;
} 
原文地址:https://www.cnblogs.com/CLGYPYJ/p/7619932.html