回型遍历

来源:互联网 发布:网络阅读利弊的辩论 编辑:程序博客网 时间:2024/05/22 01:35

QAQ
按说最差也就四十万啊,为啥不过。。。。

#include <cstdio>#include <iostream>using namespace std;int getv(int col, int row, int max_col, int max_row) {      int level = min(min(row, max_row - 1 - row), min(col, max_col - 1 - col));      int distance = row + col - level * 2;      int start_value = 2 * level * (max_row + max_col - 2 * level) + 1;      if (row == level || col == max_col - 1 - level || (max_col < max_row && level * 2 + 1 == max_col))          return start_value + distance;      int next_value = start_value + (max_row + max_col - 4 * level - 2) * 2;      return next_value - distance;  } int dx[]={0,0,1,-1},dy[]={1,-1,0,0};int main(){    int n,m,x,y,z;    scanf("%d%d%d%d%d",&n,&m,&x,&y,&z);    int now_x=x,now_y=y;    for(int i=1;i<=z;i++)    {        int now=getv(now_x,now_y,n,m);        for(int j=0;j<=3;j++)         if(getv(now_x+dx[j],now_y+dy[j],n,m)==now+1)          {            now_x+=dx[j],now_y+=dy[j];            break;          }    }    printf("%d %d",now_x,now_y);}

正解!
一下走一行就行啦

#include <cstdio>#include <iostream>#define ll long longusing namespace std;long long getv(long long col, long long row, ll max_col, ll max_row) {      ll level = min(min(row, max_row - 1 - row), min(col, max_col - 1 - col));      ll distance = row + col - level * 2;      ll start_value = 2 * level * (max_row + max_col - 2 * level) + 1;      if (row == level || col == max_col - 1 - level || (max_col < max_row && level * 2 + 1 == max_col))          return start_value + distance;      ll next_value = start_value + (max_row + max_col - 4 * level - 2) * 2;      return next_value - distance;  }ll dx[]={0,1,0,-1,0},step,nows;ll n,m,x,y,z;int main(){    scanf("%lld%lld%lld%lld%lld",&n,&m,&x,&y,&z);    z+=getv(x,y,n,m);    z--;    ll ww=m-1,w=n-1;    ll x=0,y=0;     while(1)     {        if(z-w<=0)         {            y+=z;            break;         }        else         y+=w,z-=w;        if(z-ww<=0)         {            x+=z;            break;         }        else         x+=ww,z-=ww;        if(z-w<=0)         {            y-=z;            break;         }        else         y-=w,z-=w;        if(z-ww<=0)         {            x-=z;            break;         }         x-=ww,z-=ww;     }    printf("%lld %lld",y,x);}