CF38B Chess题解

##[洛谷博客](文章列表 - zmz2022 的博客 - 洛谷博客) 

## [原题](https://www.luogu.com.cn/problem/CF38B)

## 调侃一下:

### 一到非常有意思的关于国际象棋的题

#### 正好最近在下国际象棋
~~虽然没赢过qwq~~

## 正文:
### 逻辑过程是这样子的:

先筛一下城堡(车,$rook$),再筛一下原骑士(马,$knight_1$),最后筛一下新骑士($knight_2$)。

如何保证$knight_2$吃不到$knight_1$呢?

显然,只要$knight_1$吃不到$knight_2$就行。

也就是说,不可能出现~~智慧~~情况。

一个逻辑问题:

如何保证$knight_2$吃不到$rook$呢?

其实很简单,我们把$rook$看作一个$knight(r)$,同上个问题,只要$knight(r)$吃不到$knight_2$就行。


------------
### 码风诡异,谅解


------------

#### 先写标记:
```cpp
bool homo[114][514];
void kkk(int x,int y){
    if(x>=1&&y>=1&&x<=8&&y<=8){
        homo[x][y]=true;
    }
}
```
#### $rook$筛:
```cpp
void rook(int x,int y){
    kkk(x,y);
    for(int i=1;i<=8;i++){
        kkk(i,y);```
void knight(int x,int y){
    kkk(x,y);
    kkk(x-1,y-2);
    kkk(x-1,y+2);
    kkk(x-2,y-1);
    kkk(x-2,y+1);
    kkk(x+1,y-2);
    kkk(x+1,y+2);
    kkk(x+2,y-1);
    kkk(x+2,y+1);
}
```
#### $knight$筛:
```cpp
void knight(int x,int y){
    kkk(x,y);
    kkk(x-1,y-2);
    kkk(x-1,y+2);
    kkk(x-2,y-1);
    kkk(x-2,y+1);
    kkk(x+1,y-2);
    kkk(x+1,y+2);
    kkk(x+2,y-1);
    kkk(x+2,y+1);
}
```
#### 主程序:
```cpp
int main(){
    char s1[114],s2[514];
    int ans=0,x1,x2,y1,y2;
    scanf("%s",s1+1);
    scanf("%s",s2+1); 
    x1=s1[1]-'a'+1;
    x2=s2[1]-'a'+1;
    y1=s1[2]-'0';
    y2=s2[2]-'0';
    rook(x1,y1);
    knight(x1,y1);
    knight(x2,y2);
    for(int i=1;i<=8;i++){
        for(int j=1;j<=8;j++){
            if(homo[i][j]==false){
                ans++;
            }
        }
    }cout<<ans;
    return 0;
}
```

## 完整AC代码:
```cpp
#include<bits/stdc++.h>
using namespace std;
bool homo[114][514];
void kkk(int x,int y){
    if(x>=1&&y>=1&&x<=8&&y<=8){
        homo[x][y]=true;
    }
}
void rook(int x,int y){
    kkk(x,y);
    for(int i=1;i<=8;i++){
        kkk(i,y);
    }
    for(int j=1;j<=8;j++){
        kkk(x,j);
    }
}
void knight(int x,int y){
    kkk(x,y);
    kkk(x-1,y-2);
    kkk(x-1,y+2);
    kkk(x-2,y-1);
    kkk(x-2,y+1);
    kkk(x+1,y-2);
    kkk(x+1,y+2);
    kkk(x+2,y-1);
    kkk(x+2,y+1);
}
int main(){
    char s1[114],s2[514];
    int ans=0,x1,x2,y1,y2;
    scanf("%s",s1+1);
    scanf("%s",s2+1); 
    x1=s1[1]-'a'+1;
    x2=s2[1]-'a'+1;
    y1=s1[2]-'0';
    y2=s2[2]-'0';
    rook(x1,y1);
    knight(x1,y1);
    knight(x2,y2);
    for(int i=1;i<=8;i++){
        for(int j=1;j<=8;j++){
            if(homo[i][j]==false){
                ans++;
            }
        }
    }cout<<ans;
    return 0;
}
```
## 首次写博客,感谢观看!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值