Chess

Description
Two chess pieces, a rook and a knight, stand on a standard chessboard 8 × 8 in size. The positions in which they are situated are known. It is guaranteed that none of them beats the other one.

Your task is to find the number of ways to place another knight on the board so that none of the three pieces on the board beat another one. A new piece can only be placed on an empty square.

Input
The first input line contains the description of the rook’s position on the board. This description is a line which is 2 in length. Its first symbol is a lower-case Latin letter from a to h, and its second symbol is a number from 1 to 8. The second line contains the description of the knight’s position in a similar way. It is guaranteed that their positions do not coincide.

Output
Print a single number which is the required number of ways.

Sample Input
Input
a1
b2
Output
44
Input
a8
d4
Output
38
這是一道與下象棋有關的題目,題意是給你一個車和馬的座標,然後再給你一個馬,讓你判斷最後三者都不會被吃掉的可能性,注意的是三者是三個獨立的個體。
這道題要知道一點下象棋的規則;馬走“日”字, 車可以直線隨便走,然後判斷車和馬的八個方向和車的行和列即可。
我本身不會下象棋,這讓我有理由要學會象棋了。
給一下代碼:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
int tp[10][10];
int dir[8][2] = {2, 1, 2, -1, -2, 1, -2, -1, 1, 2, 1, -2, -1, 2, -1, -2};
void init()
{
    for(int i = 0; i <= 8; i++)
    {
        for(int j = 0; j <= 8; j++)
        {
            tp[i][j] = 0;
        }
    }
}
int check(int x, int y)
{
    if(x >= 1 && x <= 8 && y >= 1 && y <= 8) return 1;
    return 0;
}
int main()
{
    char a[4], b[4];
    int x1, y1, x2, y2, sum;
    while(~scanf("%s %s", a, b))
    {
        init();
        sum = 0;
        x1 = a[0] - 'a' + 1;
        y1 = a[1] - '0';
        x2 = b[0] - 'a' + 1;
        y2 = b[1] - '0';
        tp[x1][y1] = tp[x2][y2] = 1;
        for(int k = 0; k < 8; k++)
        {
            int x0 = x2 + dir[k][0];
            int y0 = y2 + dir[k][1];
            if(check(x0, y0)) tp[x0][y0] = 2;
        }
        for(int k = 0; k < 8; k++)
        {
            int x0 = x1 + dir[k][0];
            int y0 = y1 + dir[k][1];
            if(check(x0, y0)) tp[x0][y0] = 2;
        }
        for(int i = 1; i <= 8; i++)
        {
            tp[x1][i] = 3;
            tp[i][y1] = 3;
        }
        for(int i = 1; i <= 8; i++)
        {
            for(int j = 1; j <= 8; j++)
            {
//                printf("%d ", tp[i][j]);
                if(!tp[i][j]) sum++;
            }
//            puts("");
        }
        printf("%d\n", sum );
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章