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 long
using 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);
}