我的思路就是模拟
但写错了。
#include<cstdio>
#include<iostream>
using namespace std;
int x,y,n,m,z,xx,t;
int main(){
scanf("%d%d%d%d%d",&n,&m,&x,&y,&z);
xx=min(x,min(n-x,min(y,m-y)));
int w=n-2*(xx)-1,ww=m-2*xx-1;
if(n-x==xx) {
if(z>=m-xx-y-1){
z-=m-xx-y-1;y+=m-xx-y-1;
}else y+=z,z=0;
t=3;//左
}
if(y==xx){
if(z>=n-xx-x-1)
{z-=n-xx-x-1;x+=n-xx-x-1;
}else x+=z,z=0;
t=2; //下
}
if(x==xx) {
if(z>=y-xx-1){
z-=y-xx-1;y-=y-xx-1;w--;ww-=2;
}
else y-=z,z=0;
t=1;//右
}
if(m-y==xx) {
if(z>=x-xx){
z-=x-xx;x-=x-xx;ww--;w-=2;
}
else x-=z,z=0;
t=0; //上
}n--,m--;//printf("%d %d %d\n",x,y,z);
while(z){
if(t==0){
if(z-ww<=0){y-=z;
break;
}
y-=ww;z-=ww;
ww--;t=1;
}
else if(t==1){
if(z-w<=0){x+=z;
break;
}
x+=w;z-=w;
w--;t=2;
}
else if(t==2){
if(z-ww<=0){y+=z;
break;
}
y+=ww;z-=ww;
ww--;t=3;
}
else if(t==3){
if(z-w<=0){x-=z;
break;
}
x-=w;z-=w;
w--;t=0;
}
printf("%d %d %d %d %d\n",x,y,z,w,ww);
}
printf("%d %d",x,y);
}
之前初始条件特判错了ac代码
。。。。。。。。。。。
#include<cstdio>
#include<iostream>
using namespace std;
int x,y,n,m,z,xx,t;//t是方向
int main(){
scanf("%d%d%d%d%d",&n,&m,&x,&y,&z);n--,m--;
xx=min(x,min(n-x,min(y,m-y)));
int w,ww;//w是横行走的步数,ww是竖行,每一次需要走的步数是上一行或上一列减一,然后模拟
if(n-x==xx) {//w,ww的初始值因起始位置不同,一共四种情况,特判就行了
if(z>=m-xx-y){
z-=m-xx-y;y+=m-xx-y;
}else y+=z,z=0;
t=3;//左
ww=m-2*xx-1;
w=n-2*xx;
}
if(y==xx){
if(z>=n-xx-x)
{z-=n-xx-x;x+=n-xx-x;
}else x+=z,z=0;
t=2; //下
ww=m-2*xx;
w=n-2*xx;
}
if(x==xx) {
if(z>=y-xx-1){
z-=y-xx-1;y-=y-xx-1;
}
else y-=z,z=0;
ww=m-2*xx-2;
w=n-2*xx-1;
t=1;//右
}
if(m-y==xx) {
if(z>=x-xx){
z-=x-xx;x-=x-xx;
}
else x-=z,z=0;
w=n-2*xx-1;
ww=m-2*xx-1;
t=0; //上
}
//printf("%d %d\n",w,ww);
//printf("%d %d %d\n",x,y,z);
while(z){
if(t==0){
if(z-ww<=0){y-=z;
break;
}
y-=ww;z-=ww;
ww--;t=1;//模拟很容易
}
else if(t==1){
if(z-w<=0){x+=z;
break;
}
x+=w;z-=w;
w--;t=2;
}
else if(t==2){
if(z-ww<=0){y+=z;
break;
}
y+=ww;z-=ww;
ww--;t=3;
}
else if(t==3){
if(z-w<=0){x-=z;
break;
}
x-=w;z-=w;
w--;t=0;
}
//printf("%d %d %d %d %d\n",x,y,z,w,ww);
}
printf("%d %d",x,y);
}