题解 P6194 【[EER1]苏联人】

这道题是一道非常良心的签到题但我却错了好几次(雾

(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