这道题是一道非常良心的签到题但我却错了好几次(雾
\(Solution\)
这道题有一个坑点,就是你不能一边读入一边就处理了,我就栽在了这个坑里。处理战车和主教需要用到三重循环,前两重遍历横纵坐标,第三重遍历战车或主教能攻击到的位置,战车和主教每个都用四个单重循环来遍历位置,具体内容参见代码。
\(code\)
//#include<bits/stdc++.h>//万能头文件
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;//标准数据库
char ch[8][8];
bool ans[8][8];
int main()
{
for(int i=0;i<8;i++) scanf("%s",ch[i]);//现将整个棋盘输入进去
for(int i=0;i<8;i++)//遍历8行
{
for(int j=0;j<8;j++)//遍历8列
{
if(ch[i][j]==‘R‘)//如果是战车
{
ans[i][j]=1;//先将自己站的位置标1
for(int k=i-1;k>=0 && ch[k][j]==‘.‘;k--) ans[k][j]=1;//这个战车的上方不能放国王,所以全都设为1
for(int k=i+1;k<8 && ch[k][j]==‘.‘;k++) ans[k][j]=1;//这个战车的下方也不能放国王,所以也全都设成1
for(int k=j-1;k>=0 && ch[i][k]==‘.‘;k--) ans[i][k]=1;//同理这个战车的z左边也不能放国王
for(int k=j+1;k<8 && ch[i][k]==‘.‘;k++) ans[i][k]=1;//同理这个战车的右边也不能放国王
}
else if(ch[i][j]==‘B‘)//如果是主教
{
ans[i][j]=1;//先将自己的位置标1
for(int k=i-1,l=j-1;k>=0 && l>=0 && ch[k][l]==‘.‘;k--,l--) ans[k][l]=1;//左上方不能放国王
for(int k=i+1,l=j+1;k<8 && l<8 && ch[k][l]==‘.‘;k++,l++) ans[k][l]=1;//右下方也不能放国王
for(int k=i-1,l=j+1;k>=0 && l<8 && ch[k][l]==‘.‘;k--,l++) ans[k][l]=1;//右上方也不能放国王
for(int k=i+1,l=j-1;k<8 && l>=0 && ch[k][l]==‘.‘;k++,l--) ans[k][l]=1;//左下方也不能放国王
}
}
}
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++) printf("%d",!ans[i][j]);//因为上面不行的地方全取的是1,所以输出时取反即可
puts("");
}
return 0;
}
记得留赞呦,Thanks?(?ω?)?
原文:https://www.cnblogs.com/ForeverOIer/p/12660406.html