本文主要是介绍Codeforces #217 (Div. 2) A Rook, Bishop and King,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
第二次做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;elseflag2=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;
}
这篇关于Codeforces #217 (Div. 2) A Rook, Bishop and King的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!