370A. Rook, Bishop and King codeforce题解

题目链接

思路:给个8*8的棋盘,有三种棋,给你初始位置和目标位置,输出三种棋到达目标的最小步数。
我们先看rook,由于他可以横着竖着走任意距离,所以,他最多走两步(一横一竖),最少走一步(如果竖行或者横行就在他的位置)
再看Bishop,他只能斜着走,说明他可能会走不到目标点(要么他只能走黑格子要么只能走白格子),然后走一步还是两步的原理和rook一样了
最后看King,由于可以走八个方向。所以他最优解就是每次往目标点最近距离移动即可,那么值为 max(abs(r1 - r2), abs(c1 - c2))

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;
const int N = 1010;

int main() {
    int r1,c1,r2,c2;
    cin>>r1>>c1>>r2>>c2;
    
    //rook
    if(r1==r2||c1==c2)cout<<1<<" ";//当前行或列与目标行或列某一个相同
    else cout<<2<<" ";
    
    //Bishop
    if((c1+r1)%2!=(c2+r2)%2)cout<<0<<" ";//白格是c+r是偶数,黑格是奇数
    else if(r1 + c1 == r2 + c2)cout<<1<<" ";//在右斜对角线
    else if( r1 - c1 == r2 - c2)cout<<1<<" ";//在左斜对角线
    else cout<<2<<" ";
    
    
    //King
    cout<<max(abs(r1-r2),abs(c1-c2))<<endl;
  
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值