[结题报告]11494 - Queen Time limit: 1.000 seconds

本文探讨了国际象棋中皇后如何在标准棋盘上从一个位置移动到另一个位置所需的最少步骤数,提供了算法解决方案并给出了实例代码。
 Queen 

 

The Problem

The game of Chess has several pieces with curious movements. One of them is the Queen, which can move any number of squares in any direction: in the same line, in the same column or in any of the diagonals, as illustrated by the figure below (black dots represent positions the queen may reach in one move):

The great Chess Master Kary Gasparov invented a new type of chess problem: given the position of a queen in an empty standard chess board (that is, an 8 x 8 board) how many moves are needed so that she reaches another given square in the board?

Kary found the solution for some of those problems, but is having a difficult time to solve some others, and therefore he has asked that you write a program to solve this type of problem.

The Input

The input contains several test cases. The only line of each test case contains four integers X1Y1X2 andY2 (1 ≤ X1, Y1, X2, Y2 ≤ 8). The queen starts in the square with coordinates (X1, Y1), and must finish at the square with coordinates (X2, Y2). In the chessboard, columns are numbered from 1 to 8, from left ro right; lines are also numbered from 1 to 8, from top to bottom. The coordinates of a square in line X and column Y are (X, Y).

The end of input is indicated by a line containing four zeros, separated by spaces.

The Output

For each test case in the input your program must print a single line, containing an integer, indicating the smallest number of moves needed for the queen to reach the new position.

Sample Input

 

4 4 6 2
3 5 3 5
5 5 4 3
0 0 0 0

 

Sample Output

 

1
0
2

参考代码:
题给定坐标,求西洋棋中皇后需要多少步才能到指定位置,西洋棋中皇后可以横,竖,斜走,另外不限步数,所以在棋盘的上坐标皇后最多2步即可到达.因此如果x,y相等不必走了,已经一致了,x,y任意一个相等,以及呈比例.只需一步.剩下的就是要走2步的了.
#include<stdio.h>
int main(void)
{
    int x1,x2,y1,y2;
    while(scanf("%d%d%d%d",&x1,&y1,&x2,&y2)!=EOF)
    {
        if((x1==0&&x2==0)&&(y1==0&&y2==0))break;
        if(x1==x2&&y1==y2)
        printf("0\n");
        else if((y1==y2)||(x1==x2))
        printf("1\n");
        else if(((x1-x2)/(y1-y2)==-1||(x1-x2)/(y1-y2)==1)&&(x1-x2)%(y1-y2)==0)
        printf("1\n");
        else
        printf("2\n");
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/sjy123/archive/2013/02/22/2922206.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值