残缺的棋盘

题目描述

 

在国际象棋里,王是最重要的一个棋子。每一步,王可以往上下左右或者对角线方向移动一 步,如下图所示。 

给定两个格子 A(r1,c1), B(r2,c2),你的任务是计算出一个王从 A到 B至少需要走多少步。为了 避免题目太简单,我们从棋盘里拿掉了一个格子 C(r3,c3)(ABC保证互不相同),要求王从 A 走到 B的过程中不能进入格子 C。在本题中,各行从上到下编号为 1~8,各列从左到右编号为 1~8。 

 

输入

输入包含不超过 10000 组数据。每组数据包含 6个整数 r1, c1, r2, c2, r3, c3 (1<=r1, c1, r2, c2, r3, c3<=8). 三个格子 A, B, C保证各不相同。

输出

对于每组数据,输出测试点编号和最少步数。

样例输入

1 1 8 7 5 6
1 1 3 3 2 2

样例输出

Case 1: 7
Case 2: 3

这题不用bfs
//#include "pch.h"
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;

int main(){
    int r1, c1, r2, c2, r3, c3, ci = 1;
    while (~scanf("%d%d%d%d%d%d", &r1, &c1, &r2, &c2, &r3, &c3)){
        int ans = max(abs(r2 - r1), abs(c2 - c1)), x1 = r3 - r1, x2 = r2 - r1, y1 = c3 - c1, y2 = c2 - c1;
        if (x1*y2 - x2 * y1 == 0 && abs(x2) == abs(y2) && (x1*x1 + y1 * y1 < x2*x2 + y2 * y2) && (x1*x2 >= 0 && y1*y2 >= 0))
            ans += 1;
        printf("Case %d: %d\n", ci++, ans);
    }
    return 0;
}

 

posted @ 2018-08-27 11:24  繁华中央  阅读(159)  评论(0编辑  收藏  举报