题目链接
塔子哥的国际象棋困境-腾讯2023笔试(codefun2000)
题目内容
塔子哥是一位著名的国际象棋高手,他最喜欢在棋盘上布置皇后棋子。国际象棋棋盘由 8×8 个方格组成,行数用数字
1 到 8 表示,列数用字母 a 到 h 表示。例如,第一行第一列就是 a1,第二行第四列就是 d2。
某一天,塔子哥在棋盘上放置了一个皇后。作为国际象棋高手,他很清楚皇后可以攻击到同一行、同一列以及同一对角线(45 度或 135 度)的所有棋子。现在,塔子哥希望你能帮助他计算出,这个皇后能够攻击到的所有棋格子。
输入描述
输入包含一行,一个长度为 2 的字符串,表示皇后所在的位置。
输出描述
第一行输出一个整数 n,表示皇后能够攻击到的棋格子数量。
第二行输出 n 个长度为 2 的字符串,每个字符串表示一个被攻击到的棋格子,输出时按位置的字典序从小到大输出
样例1
输入
a1
输出
21
a2 a3 a4 a5 a6 a7 a8 b1 b2 c1 c3 d1 d4 e1 e5 f1 f6 g1 g7 h1 h8
题解1
#include<bits/stdc++.h>
using namespace std;
char s[4];
set<pair<char,char>> ans;
void solve(){
// 同一行
for(int i = 0; i < 8; i++){
if('a'+i != s[1]) ans.insert({'a'+i,s[2]});
}
// 同一列
for(int i = 1; i <= 8; i++){
if(i != s[2]-'0') ans.insert({s[1], i + '0'});
}
// 45度对角线
for(int i = 1; i <= 8; i++){
if(s[1]+i < 'a'+8 && s[2] - '0' + i <= 8) ans.insert({s[1]+i,s[2]+i});
if(s[1]-i >= 'a' && s[2] - '0' - i > 0) ans.insert({s[1]-i,s[2]-i});
}
// 135度对角线
for(int i = 1; i <= 8; i++){
if(s[1]+i < 'a'+8 && s[2] - '0' - i > 0) ans.insert({s[1]+i,s[2]-i});
if(s[1]-i >= 'a' && s[2] - '0' + i <= 8) ans.insert({s[1]-i,s[2]+i});
}
}
int main(){
scanf("%s", s + 1);
solve();
printf("%d\n", int(ans.size()));
for(auto& it: ans){
printf("%c%c ", it.first,it.second);
}
printf("\n");
return 0;
}