第二次做codeforces,坑得要死有木有
尼玛就做出一题,最后还错了!!
题目的意思是对三种棋子有三种移动方法:
1、同行或同列随意移动步数
2、对角线上随意移动步数
3、任意方向移动一步
给出(r1,c1) (r2,c2)
保证两坐标不同
输出三种移动方式下的最小步数
主要还是心态没有调整好,一心想着早点交导致错误和底下各种问题。
分析第一种情况:若行和列有一个相等的,则移动一次;两者均不同则移动两次。
分析第二种情况:可知一共有0、1、2三种可能,无法移动到则为0,在其主对角线上则为1,移动到对角线上某点后再以该位置为起始位置移动对角线为2;
结果为1对应的为abs(r1-r2)==abs(c1-c2);
结果为2对应的为abs(r1-r2)-abs(c1-c2)为2的倍数且不为0;
不符合两种情况的则对应0
分析第三种情况:若r1==r2,则移动abs(c1-c2);若c1==c2,则移动abs(r1-r2);若均不相等,则可分析得只需移动abs(c1-c2)和abs(r1-r2)中的较大者步即可!
在写博客的过程中才意识到最大的错误是没有看这个图!!!!!!!!!!
怒贴一记代码:
#include <stdio.h>
#include <stdlib.h>
int max(int a,int b)
{ return a>b?a:b;}
int main(void)
{
int r1,c1,r2,c2;
int a,b;
while(scanf("%d%d%d%d",&r1,&c1,&r2,&c2)!=EOF)
{
int flag1=0,flag2=0,flag3=0;
a=abs(r1-r2);
b=abs(c1-c2);
if(r1!=r2)
flag1++;
if(c1!=c2)
flag1++;
if(abs(a-b)%2==0)
{
if(a==b)
flag2=1;
else
flag2=2;
}
if(r1==r2)
flag3=b;
else if(c1==c2)
flag3=a;
else flag3=max(a,b);
printf("%d %d %d\n",flag1,flag2,flag3);
}
return 0;
}