##[洛谷博客](文章列表 - 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;
}
```
## 首次写博客,感谢观看!